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

這是我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); 
     } 
    } 
} 

當我使用musicThread.interrupt()在closeApp()方法,沒有任何反應,和MP3文件仍然被播放。我試圖插入與InterruptedException的catch子句,但Eclipse始終強調它爲InterruptedException不存在...

任何想法?

編輯:我用Javazoom播放器播放MP3文件。我使用JavaSE-1.6環境。

謝謝。

+0

玩家應該有控件來控制媒體。因此,控制媒體的對象應該是共享資源。這樣你就可以隨心所欲地控制媒體。然後,當您關閉應用程序時,您停止播放器。此外,保持線程活着的條件應該重新設計。 – Sebastian

回答

2

我不知道你在用什麼玩家,但我想應該通過撥打playMP3.stop()來停止。至少這是JDK 7中的MediaPlayer停止的方式。

無論如何,您正試圖中斷運行playMP3.play();的線程,這似乎是阻止方法,例如,它不會時常檢查它是否中斷狀態。一旦當前曲目播放完畢,執行應該在這條線的檢查之後停止:

while(!musicThread.isInterrupted()){ 

UPDATE

我的猜測是,你要打斷你的線程這是運行這條線:

playMP3.play(); 

而且這種方法是一個阻塞程序,它不能被調用Thread.interrupt()中斷。它只是這樣寫的 - 它不會在播放音樂時檢查中斷狀態。的

因此而不是調用

musicThread.interrupt()

你應該把你的播放器變量到一個更高的層次,並呼籲:

playMP3.close(); 

這要根據文檔停止音樂:

public synchronized void close() - Cloases t他的球員。任何正在播放的音頻立即停止 。

+0

你能用我的例子更準確地描述你的答案嗎?我嘗試在播放這樣的[鏈接](http://pastebin.com/vT2bkwbw)之後播放playMP3.close(),但沒有任何變化,我的文件在循環中播放良好,但在應用程序關閉時仍然播放。 – mickaelb91

+0

更新,我希望這會有所幫助。 –

+0

謝謝我現在明白了,我相信即使在我的closeApp()方法中放置了playMp3.close(),該線程也會繼續處理。但是它不是這種情況,線程會自動停止。 ;) – mickaelb91