Java 如何安排后台线程在我的应用程序中播放声音?

Java 如何安排后台线程在我的应用程序中播放声音?,java,android,multithreading,Java,Android,Multithreading,我有一个应对某些事件的过程。因此,当调用playFromList()时,它会播放声音池中的一些声音。然后在一个线程中,我设置了一个标志,在3,5秒内,它不应该播放任何声音 我得到的是:它播放声音,如果比等待3,5秒。如果在3.5秒内调用了5次playFromList(),它仍然会进入SoundManager.playSound(listNr),并且仍然会在17.5秒内完成。这也不是我想要的。我希望只调用一次方法SoundManager.playSound(listNr) public class

我有一个应对某些事件的过程。因此,当调用
playFromList()
时,它会播放声音池中的一些声音。然后在一个线程中,我设置了一个标志,在3,5秒内,它不应该播放任何声音

我得到的是:它播放声音,如果比等待3,5秒。如果在3.5秒内调用了5次
playFromList()
,它仍然会进入
SoundManager.playSound(listNr)
,并且仍然会在17.5秒内完成。这也不是我想要的。我希望只调用一次方法
SoundManager.playSound(listNr)

public class Settings{
    public static boolean flag = false;
}

 public class Main{
 public void playFromList(int listNr,int g){

        if(!Settings.flag){
            SoundManager.playSound(listNr);
            if(g ==0){
                mpVolume((float) 0.3);
                t5sec.run();
            }else{pauseMus();}      
        }           
    }

        private Handler vijfSeconden = new Handler(){
            public void handleMessage(Message msg){
                mpVolume((float)0.8);
            }
        };
        Thread t5sec = new Thread(){
            public void run(){
                if(Settings.flag == false){
                    Settings.flag = true;
                    try {
                        Thread.sleep(3500); 
                    } catch (InterruptedException e) {
                        Settings.flag = false;
                        e.printStackTrace();
                    }
                    vijfSeconden.sendEmptyMessage(0);

                    Settings.flag = false;
                }
            }
        };
 }

代码中几乎没有问题。也许最重要的奇怪是 t5sec.run(),在Java中,应该对Thread对象使用start方法来启动新线程。写入时,它将在调用线程中执行。 第二个问题是完全缺乏同步,我想解决这个问题的一个方法是在Settings.flag中使用AtomicBoolean而不是boolean

另一个问题是,每次启动新线程都非常昂贵。从描述中很难准确地说出您想要做什么,但如果我的理解是正确的,您应该这样做:

if ( (System.currentTimeInMillis() - lastTimePlayed) < 3500) {
 playSound();
 lastTimePlayed = System.currentTimeInMillis();
}
if((System.currentTimeInMillis()-lastTimePlayed)<3500){
播放声音();
lastTimePlayed=System.currentTimeInMillis();
}

就是这样,不需要线程。如果希望类是线程安全的,可能需要使用AtomicInteger来保存lastTimePlayed值。

更重要的是(对我来说)为什么我的代码不能以这种方式工作。我错过了什么?谢谢你,不知何故,我甚至没有想到要使用
System.currentTimeInMillis()
。关于缺乏同步化,我认为如果变量只在某一点上发生变异,就不需要了。。但我认为我错了。开始一个新的线程会很贵吗。。?你说的昂贵是什么意思?资源?例如,每个线程都会消耗内存来保存堆栈之类的东西。创建它也需要时间,线程越多,上下文切换就越多。如果不是绝对需要的话,暂时不要使用线程。。因此,我将尝试仅在绝对需要时使用线程:)还有一个问题。。在不使用线程的情况下,是否可以每隔10分钟调用一次活动?问它只是为了确保我还有一个线程,这是不可能的,但好消息是使用java.util.Timer相对容易,它将在hood@Roman每10分钟看一眼开始你的活动。