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

如何在Java中停止正在运行的音乐线程?,java,audio,Java,Audio,我有一个班,在无限循环中播放游戏背景音乐。我希望它在另一个类调用BackgroundMusic对象上的stopPlaying()方法时停止。根据Oracle文档,Java中没有停止线程的方法 它说使用一个变量,当变量为某个值时,它会检查并停止。我尝试在调用stopPlaying()时使一个布尔运行设置为false,并尝试使while循环作为条件而不是true运行,但这在没有延迟的情况下无法工作。(之前编辑的消息) 我想把我的类放在这里,但这个网站一直说它的格式不正确,我以前也这样做过(从Ecli

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

它说使用一个变量,当变量为某个值时,它会检查并停止。我尝试在调用stopPlaying()时使一个布尔运行设置为false,并尝试使while循环作为条件而不是true运行,但这在没有延迟的情况下无法工作。(之前编辑的消息)


我想把我的类放在这里,但这个网站一直说它的格式不正确,我以前也这样做过(从Eclipse粘贴)。我把它放在PasteBin上:

这是一个很大的锤子,但是你可以通过调用
musicThread.interrupt()
来中断线程。这将导致音乐线程的
isInterrupted()
返回
true
。如果线程当时正在执行一些阻塞I/O,这可能会导致抛出
InterruptedException
,因此您还需要捕获该问题:

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

同样,这是一个大问题,如果可以的话,最好使用布尔标志方法。

布尔解决方案应该有效。尝试添加您的代码,我们可以帮助您检查错误。请记住,布尔值必须是
volatile
,否则它可能会被缓存,音乐线程将永远看不到它的值更改。我会将我的类放在这里,但此网站一直说它的格式不正确,我以前也这样做过。试着在问题中加上int并粘贴你的链接如何格式化SO的代码,分3个简单的步骤:1)使用文本编辑器用所需数量的空格字符替换制表符。理想情况下,将其换行为80个字符,这样就不会出现水平滚动条。2) 剪切并粘贴到SO编辑器窗格中。3) 选择刚刚粘贴的代码,然后单击编辑窗格顶部的“代码示例”按钮。看起来像{}的那个。4) 在预览中看起来还可以吗?@StephenC这是一个很好的建议。不过有一点值得注意。我从来没有遇到过使用制表符(TextPad通常使用)或空格字符(Netbeans默认使用)发布代码的问题。结果都是一样的。我试过这样做,但这并不能阻止音乐播放。线程API往往不提供明确的机制来杀死线程,因为这样做的结果可能非常不可预测。如果线程被终止并持有资源怎么办?因此,方法总是安排中断或销毁线程被阻塞的资源。在音频播放器的情况下,突然停止它将导致听到咔哒声-真正需要的是在大约250ms的时间内降低增益。在程序运行时退出java进程会导致-甚至更糟-一瞬间发出令人讨厌的静态声音。可以修复,但是interrupt()方法并没有为我阻止它。