2012-12-21 102 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()方法。你尝试过吗? –