我正在创建一个需要大量声音才能快速播放的游戏。每个声音都由一个 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 播放器的指针也将不胜感激。
最佳答案
您在线程内使用 join()
,这没有任何意义。当线程不再 Activity 时,Join
方法返回。在您的情况下,当您在 Activity 线程中调用 join
方法时,它永远不会返回。
关于java - Java中如何立即停止一个线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32457497/