如何立即停止Java中的线程

时间:2015-09-08 12:10:41

标签: java multithreading audio

我正在制作一款需要快速播放声音的游戏。每个声音都由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播放器的指针都会受到赞赏。

1 个答案:

答案 0 :(得分:0)

你在线程中使用join()没有任何意义。当线程不再存在时,Join方法返回。在您的情况下,当您在活动线程中调用join方法时,它将永远不会返回。