java - Java中如何立即停止一个线程

标签 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 播放器的指针也将不胜感激。

最佳答案

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

关于java - Java中如何立即停止一个线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32457497/

相关文章:

c# - WPF高并发跨线程UI访问

c# - 杀死线程,真的!

ios - iOS,实现文本阅读并使用预保存的MP3文件突出显示所选文本

java - 在实体类中创建其他公共(public)方法

基于 Java 的 Web 框架替代品

c++ - boost asio 在线程中运行 io_service

javascript - 在 Javascript 中将立体声音频转换为单声道

Java 按位运算符 ^ - 位如何打乱

java - 在我返回 Android 项目中的 Activity 之前,变量不会得到更新

c++ - 在 C++ 中使用 alsa 的 dmix 插件进行音频混合