0

我在中断在应用程序后台播放 mp3 文件的线程时遇到了一些问题。我会循环播放文件并在应用程序关闭时停止它。这是我的主要课程:

public class Main {

        public static String musicPath = "/loop.mp3";
        public class RunnableMusic implements Runnable{
            public void run(){
                System.out.println("Listen... " + musicPath.replace("/", "").replace(".mp3", "").replace(".wav", ""));
                 while(!musicThread.isInterrupted()){
                    BackgroundMusic.listen(musicPath);
                 }
            }
        }
        public Thread musicThread = new Thread(new RunnableMusic());
        public static void main(String[] args){
            musicThread.start();
        }
        public static closeApp(){
        }
    }

这是我的背景音乐课:

public class BackgroundMusic{
    public static void listen(String music){
        InputStream file = BackgroundMusic.class.getResourceAsStream(music);
        try {
            InputStream bufferedIn = new BufferedInputStream(file);
            Player playMP3 = new Player(bufferedIn);
            playMP3.play();
            playMP3.close();
        } catch (Exception e) {
            System.out.println("Couldn't play music : " + e);
        } 
    }
}

当我在 closeApp() 方法中使用 musicThread.interrupt() 时,没有任何反应,并且仍然播放 mp3 文件。我试图用 InterruptedException 插入 catch 子句,但 Eclipse 总是强调它,因为 InterruptedException 不存在......

任何想法 ?

编辑:我使用 Javazoom Player 播放 mp3 文件。我使用 JavaSE-1.6 环境。

谢谢。

4

1 回答 1

2

我不知道您使用的是什么播放器,但我想应该通过调用来停止它playMP3.stop()。至少这是MediaPlayer在 JDK 7 中停止的方式。

无论如何,您正在尝试中断正在运行的线程,playMP3.play();这似乎是一种阻塞方法,例如,它不会不时检查它的中断状态。当前曲目播放完毕后,应在检查此行后停止执行:

while(!musicThread.isInterrupted()){

更新

我的猜测是您正试图中断正在运行此行的线程:

 playMP3.play();

而且这个方法是一个阻塞例程,不能被调用中断Thread.interrupt()。它只是这样写的——它在播放音乐时不检查中断状态。

所以而不是打电话

musicThread.interrupt()

您应该将您的玩家变量提升到更高的级别并调用:

 playMP3.close();

根据文档应该停止音乐:

public synchronized void close()- 关闭这个玩家。当前播放的任何音频都会立即停止。

于 2013-11-22T20:19:47.543 回答