在JFugue暂停音乐

时间:2012-12-21 03:54:41

标签: java multithreading pausing-execution jfugue

我正在开发一个通过多线程在后台播放音乐的程序,因为GUI会冻结。我有多线程的基本知识(易失性,同步等),但我想知道如何立即停止/暂停一个线程(即使进程正在处理)。我在背景中循环播放音乐,但如果我将一个停止变量挂到循环中,则歌曲必须停止播放以停止播放音乐。所以我的问题仍然存在,从母线程中有任何方法可以立即暂停或终止歌曲中间的音乐,因为我可以播放音频。

1 个答案:

答案 0 :(得分:1)

首先,线程中的大多数循环应该类似于:

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

如果循环内部存在阻塞调用(听起来与描述类似),则可能允许中断()。从线程外部调用interrupt()将破坏阻塞调用并将您转储到catch块中。这最终会清除“中断”标志,因此您需要再次调用中断以退出循环。

取决于您播放音乐的方式:

  • 如果您使用的是具有“暂停”或“停止”方法的音乐库来播放音乐,您可以使用它。看起来你正在使用jFugue - 它的播放器有一个pause()方法 - 你试过调用它吗?
  • 如果你正在做其他事情,你需要跟踪歌曲的位置并在线程上调用interrupt()。如果要重新启动,则需要回到跟踪位置

请注意,如果要使用上述循环重新启动,则需要嵌套循环,例如:

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

如果您只有!isInterrupted()循环,则线程将完成,并且无法重新启动。

希望这有帮助!