我在游戏中播放声音时遇到问题。当处理声音播放的线程退出它的运行方法时,它不会终止/结束/停止。我知道是这种方法导致了问题,因为当我评论整个事情时,没有更多的线程被创建。(使用 JVisualVM 检查)。问题是线程在退出 run 方法后不会终止。我放置了一个打印命令,以确保它实际上到达 run() 方法的末尾,而且它总是这样。
但是,当我使用 来检查进程时JVisualVM
,每个播放的声音线程数都会增加1
。1
我还注意到,每个播放的声音都会增加守护线程的数量。我不确定守护线程是什么以及它们是如何工作的,但我已经尝试以多种方式杀死线程。通过return包含Thread.currentThread
.stop()
.destroy()
.suspend()
.interrupt()
并从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();
}