我正在制作一款需要快速播放声音的游戏。每个声音都由Sound类表示,其play()
方法创建一个Thread对象以异步修改Clip,因为某些原因clip.stop()
在一段时间后导致明显的延迟。我的问题是,过了一段时间,所有这些线程都会堆积起来,最终程序崩溃并出现OutOfMemoryError。
public void play()
{
Thread thread = new Thread()
{
public void run()
{
if (clip.isRunning()) clip.stop();
clip.setFramePosition(0);
if (isAmbient) clip.loop(Clip.LOOP_CONTINUOUSLY);
else clip.start();
try
{
Thread.sleep(clip.getMicrosecondLength() / 1000);
join();
}
catch (InterruptedException ie)
{
ie.printStackTrace();
}
}
};
thread.setDaemon(true);
thread.start();
}
我试图在别处寻找这个问题的答案,但我创建的线程不循环;他们只需要执行一次然后立即死亡。如果我没有使用这些线程,正如我之前所说,快速连续播放相同的声音会在一段时间后明显延迟。我对这个声音引擎不太确定,所以任何指向暂停和可恢复的wav播放器的指针都会受到赞赏。
答案 0 :(得分:0)
你在线程中使用join()
没有任何意义。当线程不再存在时,Join
方法返回。在您的情况下,当您在活动线程中调用join
方法时,它将永远不会返回。