2013-04-21 2 views
3

У меня есть класс, который воспроизводит фоновую музыку в бесконечном цикле для игры. Я хочу, чтобы он остановился, когда другой класс вызывает метод stopPlaying() на объекте BackgroundMusic. Согласно документам Oracle, нет способа остановить поток в Java.Как остановить исполняемый поток музыки в Java?

Он сказал, что использует переменную, которая проверяет и останавливается, когда переменная является определенным значением. Я попытался сделать boolean running, который получает значение false, когда я вызываю stopPlaying() и пытаюсь заставить цикл while работать как условие вместо true, но это не сработало без задержки. (Сообщение отредактировано ранее)

Я бы разместил свой класс здесь, но этот сайт продолжает говорить, что он не отформатирован правильно, и я сделал это раньше (вставка из Eclipse). Я положил его на Pastebin: http://pastebin.com/edCH2DXE

+0

Булево решение должно работать. Попытайтесь добавить свой код, и мы можем помочь вам проверить, что не так. – BobTheBuilder

+0

Помните, что логическое значение должно быть 'volatile', иначе оно может быть кэшировано, и музыкальный поток никогда не увидит изменения его значения. – Thomas

+0

_I ставил бы мой класс здесь, но этот сайт продолжает говорить, что он не отформатирован должным образом, и я сделал это раньше. Попробуйте поместить int в [PasteBin] (http://pastebin.com/) и вставьте свою ссылку в вопросе – BackSlash

ответ

1

Это своего рода большой молоток, но вы можете прервать нить по телефону musicThread.interrupt(). Это приведет к тому, что isInterrupted() вернет true для музыкального потока. Если нить делал некоторые блокировки ввода/вывода в то время, это может привести к InterruptedException быть выброшен, так что вам нужно, чтобы поймать, что хорошо:

try { 
    while (!Thread.currentThread().isInterrupted()) { 
     // play music 
    } 
    } catch (InterruptedException ex) { 
    // any cleanup necessary 
    } 

Опять же, это большой молоток, и это лучше использовать булевский флаг подходит, если можно.

+0

Я пытался это сделать, но это не мешает музыке играть. – sudo

+1

API-интерфейсы Threading, как правило, не предоставляют явных механизмов для уничтожения потоков, поскольку результаты этого могут быть очень непредсказуемыми. Что делать, если поток был прекращен, удерживая ресурсы? По этой причине подход всегда заключается в том, чтобы организовать прерывание или уничтожить ресурсы, на которые заблокирован поток. В случае с аудиопроигрывателем внезапная остановка приведет к слышимому щелчку - то, что действительно необходимо, - это снижение коэффициента усиления примерно на 250 мс. – marko

+0

Выход из java-процесса во время работы программы приводит к тому, что еще хуже - неприятный статический звук в течение секунды. Fixable, но метод interrupt() просто не останавливает его для меня в любом случае. – sudo

Смежные вопросы