我在游戏中播放声音时遇到了问题。当处理声音播放的线程退出其运行方法时,它不会终止/结束/停止。我知道这个方法是导致问题的原因,因为当我将整个内容注释掉后就不再创建任何线程了(使用JVisualVM进行了检查)。问题在于线程在退出run方法后不会被终止。我已经放置了一个打印命令来确保它实际上到达了run()方法的末尾,并且它总是会到达。
然而,当我使用JVisualVM检查进程时,每次播放声音时线程计数都会增加1。我还注意到每次播放声音时守护线程的数量会增加1。我不确定守护线程是什么以及它们如何工作,但我已经尝试了多种方式来终止线程,包括Thread.currentThread.stop()、.destroy()、.suspend()、.interrupt()以及通过return;从run()方法返回。
在编写此消息时,我意识到需要关闭剪辑对象。这样就不会创建和维持任何额外的线程。然而,现在声音有时会消失,我不知道为什么。现在,我可以选择在并行中播放声音并看到我的CPU由无数线程超载,或者在播放新声音时突然结束声音。
如果有人知道在并行中播放多个声音的不同方法或知道我的代码有什么问题,我将非常感激任何帮助。
这是该方法:
然而,当我使用JVisualVM检查进程时,每次播放声音时线程计数都会增加1。我还注意到每次播放声音时守护线程的数量会增加1。我不确定守护线程是什么以及它们如何工作,但我已经尝试了多种方式来终止线程,包括Thread.currentThread.stop()、.destroy()、.suspend()、.interrupt()以及通过return;从run()方法返回。
在编写此消息时,我意识到需要关闭剪辑对象。这样就不会创建和维持任何额外的线程。然而,现在声音有时会消失,我不知道为什么。现在,我可以选择在并行中播放声音并看到我的CPU由无数线程超载,或者在播放新声音时突然结束声音。
如果有人知道在并行中播放多个声音的不同方法或知道我的代码有什么问题,我将非常感激任何帮助。
这是该方法:
public static synchronized void playSound(final String folder, final String name) {
new Thread(new Runnable() { // the wrapper thread is unnecessary, unless it blocks on the Clip finishing, see comments
@Override
public void run() {
Clip clip = null;
AudioInputStream inputStream = null;
try{
do{
if(clip == null || inputStream == null)
clip = AudioSystem.getClip();
inputStream = AudioSystem.getAudioInputStream(SoundP.class.getResource(folder + "/" + name));
if(clip != null && !clip.isActive())
inputStream = AudioSystem.getAudioInputStream(SoundP.class.getResource(folder + "/" + name));
clip.open(inputStream);
clip.start();
}while(clip.isActive());
inputStream.close();
} catch (LineUnavailableException e) {
e.printStackTrace();
} catch (UnsupportedAudioFileException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}).start();
}
{ ... }
。 - erickson