Прежде всего, вам необходимо ознакомиться с потоками, так как этот проект, над которым вы работаете, использует их! Ваш учебник класса может охватывать эту тему. Внимательно прочитайте. Темы ОЧЕНЬ важны. Если ваш учебник не понятен, вы также можете прочитать официальный учебник Java .
Вернуться к вашему вопросу. Каждый экземпляр вашего класса MP3 работает в отдельном потоке. Поток MP3 отделен от выполнения основной программы (имеется в виду поток, выполняющий основной метод), а пользовательский интерфейс Swing также выполняется в отдельном потоке.
Ваша ошибка указывает на то, что, чтобы процитировать Javadocs для java.lang.IllegalThreadStateException
:
поток не находится в соответствующем состоянии для запрошенной операции.
См., Например, методы suspend и resume в классе Thread.
Вот некоторые вещи, на которые стоит посмотреть:
- Ваш класс таймера может остановиться и запустить поток MP3. Он вызывает playSong (текущий); и stopPlayback (). Есть ли другой класс, также вызывающий эти методы? Ваша ошибка была вызвана пользовательским событием: pa2.MP3Random $ ButtonListener.actionPerformed (MP3Random.java:373)
Вы нажали кнопку до того, как тема была готова к игре?
- В общем, вам нужно убедиться, что два потока не мешают друг другу. Классическим примером могут быть два потока, которые изменяют один и тот же список. Если первый поток удаляет элемент из списка, в то время как второй поток выполняет итерацию по списку (используя итератор или для каждого цикла), будет выдано исключение.
- Можете ли вы протестировать данные классы для воспроизведения mp3 без графического интерфейса? Просто статический вызов метода. Можно ли заставить плеер работать?
Пункт 2 в моем ответе, вероятно, не связан с вашей проблемой - это просто важно понимать при работе с потоками. Например, если список доступных песен должен был измениться в вашей PlaylistPanel (несколько потоков могли бы изменить его), то вам нужно было бы синхронизировать часть этого класса. Это заставляет поток ждать, если другой поток выполняет синхронизированный метод. Ваша проблема пытается перезапустить «мертвый» поток Посмотрите на JavaDocs для потока :
Никогда не разрешено начинать поток более одного раза. В частности,
поток не может быть перезапущен после завершения выполнения.
Итак, чтобы запустить поток, вы вызываете start. Начать звонки. Этот поток теперь будет «запускаться» одновременно с другими потоками, пока run () не завершится. И как только он заканчивается, мы закончили с этим потоком. Если мы хотим, чтобы один и тот же поток воспроизводил несколько песен, нам нужно реализовать это поведение. Но метод запуска, который вы опубликовали (который, я думаю, вы не написали; он был дан как часть этого задания), очень прост. Он вызывает player.play();
и когда palay завершается, поток завершается.
Я думаю, что последняя строка метода run () должна быть player = null
, чтобы метод isPlaying () работал правильно.