0

我正在开发一个通过多线程在后台播放音乐的程序,因为 GUI 否则会冻结。我对多线程(易失性、同步等)有基本的了解,但我想知道如何立即停止/暂停线程(即使进程正在处理)。我有音乐在后台循环播放,但是如果我将停止变量连接到循环中,则歌曲必须停止播放才能使音乐停止。所以我的问题仍然存在,从父线程有没有办法在歌曲中间立即暂停或终止音乐,因为我有音频要播放。

4

1 回答 1

1

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

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

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

根据您播放音乐的方式:

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

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

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

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

希望这可以帮助!

于 2012-12-21T04:20:14.170 回答