2012-12-21 103 views
0

我正在研究通過多線程在後臺播放音樂的程序,因爲否則GUI會凍結。我有多線程(易失性,同步等)的基本知識,但我想知道如何立即停止/暫停線程(即使進程正在處理)。我有背景音樂循環播放,但如果我將一個停止變量掛到循環中,那麼歌曲必須停止播放才能停止播放音樂。所以我的問題仍然存在,從父線程有什麼方法立即暫停或終止在歌曲中間的音樂,因爲我有音頻後播放。在JFugue中暫停音樂

+0

是否要暫停音樂或暫停主題? (提示:你想暫停音樂,而不是線程,該線程可能會有一個關鍵的鎖。) –

+0

@DavidSchwartz然後是的,我想暫停音樂,我會改變標題。 – EpicDavi

回答

1

首先,在一個線程中最環路應類似於此:

while(!isInterrupted()) { 
    try { 
     // do something (like play song) 
    } catch (InterruptedException e) { 
     interrupt(); 
    } 
} 

如果有內環路阻塞調用(這聽起來像是你的描述),他們可能允許中斷()。從線程外部調用interrupt()將打破阻塞調用並將您轉儲到catch塊中。這最終會清除「中斷」標誌,所以你需要再次調用中斷才能退出循環。

視您正在播放音樂:

  • 如果您使用的是有一個「暫停」一庫或「停止」的方法來播放音樂,你可以使用它。看起來你正在使用jFugue - 它的播放器有一個暫停()方法 - 你試過調用它嗎?
  • 如果你正在做別的事情,你需要跟蹤歌曲的位置並在線程中調用interrupt()。如果你想重新開始,你需要尋求回追蹤的位置

請注意,如果你想與上述循環重新開始,你需要一個嵌套的循環如:

while(true) { 
    while(!isInterrupted()) { 
     ... 
    } 
} 

如果您只有!isInterrupted()循環,則該線程將完成並且無法重新啓動。

希望這會有所幫助!

+0

注:我剛剛注意到這個主題提到jFugue。我查看了文檔,其Player類有一個pause()方法。你嘗試過嗎? –