音乐播放时中断线程

时间:2013-11-22 19:59:28

标签: java multithreading while-loop interrupt interrupted-exception

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

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(){
        }
    }

这是我的BackgroundMusic类:

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 Environment。

感谢。

1 个答案:

答案 0 :(得分:2)

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

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

while(!musicThread.isInterrupted()){

<强>更新

我的猜测是你试图打断运行这一行的线程:

 playMP3.play();

此方法是一个阻塞例程,不能通过调用Thread.interrupt()来中断。它只是这样写的 - 它不会在播放音乐时检查中断状态。

所以不要打电话

musicThread.interrupt()

您应该将播放器变量调到更高级别并致电:

 playMP3.close();

根据文档应该停止音乐:

  

public synchronized void close() -   Cloases这个球员。当前播放的任何音频都会停止   立即