如何在Java中停止正在运行的音乐线程?

3
我有一个用于游戏无限循环播放背景音乐的类。当另一个类调用BackgroundMusic对象上的stopPlaying()方法时,我希望它停止播放音乐。根据Oracle文档,在Java中没有停止线程的方法。

文档建议使用变量进行检查,并在该变量达到特定值时停止。我尝试创建一个布尔值running,当我调用stopPlaying()时将其设置为false,并尝试将while循环的条件设置为running而不是true,但在没有延迟的情况下这并不起作用。(从以前编辑的消息)

我想把我的类放在这里,但是这个网站一直说它格式不正确,而且我之前已经做过了(从Eclipse粘贴)。我把它放在了PasteBin上:http://pastebin.com/edCH2DXE


布尔解决方案应该是可行的。尝试添加您的代码,我们可以帮助您检查出错的地方。 - BobTheBuilder
请记住布尔值需要是“volatile”的,否则它可能会被缓存,音乐线程将永远看不到其值的更改。 - Thomas
我想在这里放置我的类,但是这个网站一直说它格式不正确,而且我以前已经做过了。请尝试将其放在PasteBin上,然后将链接粘贴到问题中。 - BackSlash
2
如何在3个简单步骤中为SO格式化代码:1)使用文本编辑器将TAB字符替换为所需数量的SPACE字符。理想情况下,将其换行到80个字符,以便您不会出现水平滚动条。2)剪切并粘贴到SO编辑器窗格中。3)选择刚刚粘贴的代码,并单击编辑窗格顶部的“代码示例”按钮。看起来像“{}”的那个。4)在预览中是否看起来正常? - Stephen C
@StephenC 好建议。不过要注意一点,我从来没有在发布代码时遇到过任何问题,无论是使用制表符(如TextPad通常使用)还是空格字符(如Netbeans默认使用)。最终呈现的效果都是一样的。 - Andrew Thompson
显示剩余2条评论
1个回答

1

这有点像一个大锤子,但你可以通过调用musicThread.interrupt()中断线程。这将导致音乐线程的isInterrupted()返回true。如果线程正在进行某些阻塞I/O操作,这可能会导致InterruptedException被抛出,因此您需要捕获它:

  try {
    while (!Thread.currentThread().isInterrupted()) {
       // play music
    }
  } catch (InterruptedException ex) {
    // any cleanup necessary
  }

再次强调,这是一个很重要的工具,如果可以的话最好使用布尔标志方法。


我尝试过那样做,但它无法停止音乐播放。 - sudo
1
线程API通常不提供显式机制来终止线程,因为这样做的结果可能非常不可预测。如果线程在持有资源时被终止会怎么样呢?因此,总是采用安排中断或销毁线程阻塞的资源的方法。对于音频播放器,突然停止会导致听到明显的噪声 - 真正需要的是在大约250毫秒内逐渐降低增益。 - marko
在程序运行时退出Java进程会导致更糟糕的结果——一声刺耳的静态声响。虽然可以修复,但无论如何interrupt()方法都不能停止它。 - sudo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接