实现空while循环以保持控制的更好方法

时间:2014-03-13 06:19:04

标签: java while-loop

我正在播放背景音频,我希望程序的控制能够保持静止,直到音频播放结束,因为我使用空循环,如下所示

while(isPlaying==true){};
mediaPlayer.stop();

正如您所看到的,while循环保持程序控制直到播放音频,然后执行下一条指令。这工作正常,但我发现这不是一个正确的方法来做空 - 虽然昂贵,我正在寻找替代方案。请帮忙。

6 个答案:

答案 0 :(得分:3)

假设你的程序是Java(...为什么你给它三个语言标签?)你有几个选择。您可以使用适当的同步事件,例如:

// fields
Object playerStopEvent = new Object();
boolean isPlaying;

// in your media player, when playback is complete:
synchronized (playerStopEvent) {
   isPlaying = false;
   playerStopEvent.notifyAll();
} 

// elsewhere, when waiting for playback to complete:
synchronized (playerStopEvent) {
   while (isPlaying) {
       try {
           playerStopEvent.wait();
       } catch (InterruptedException x) {
           // abort or ignore, up to you
       }
    }
}
mediaPlayer.stop();

有关更多示例,请参阅Guarded Blocks上的官方教程。

你也可以让mediaPlayer在完成时调用一些回调,例如在开始播放时禁用GUI组件,并在调用完成的回调时重新启用它们(您也可以在此处使用事件监听器方法)。

如果没有更多信息,我推荐后者,因为它不会阻止你在播放器播放时做其他无关的事情(或者让你的程序完全不响应),但前者可能更合适,具体取决于你的情况。

如果是C或C ++,那么概念就是一样的。使用你拥有的第一个选项的条件变量/事件的等价物,或者你对第二个选项的任何等效的回调/听众/信号+插槽。

答案 1 :(得分:2)

嗯,在我看来,最好使用另一个实现.. 尝试使用线程,这样它就不会把你的程序挂在那里(它毕竟是背景音频;你可能想在播放音频的时候做些别的事情)..

尝试检查this page ..

答案 2 :(得分:1)

您可以考虑sleep(time in milliseconds )。这将允许你的线程执行while循环睡眠指定的毫秒,然后再次检查条件。

while(isPlaying==true)
{
  Thread.currentThread().sleep(1000); // sleep for 1 sec
};

这一次很快,但更好的方法是使用@JasonC在他的回答中建议的wait()notify()机制。

答案 3 :(得分:1)

首先,您不必比较您在代码中完成的2个布尔字段...

while(isPlaying==true){};

你可以这样做..

while(isPlaying){};

并且,既然你已经告诉过你正在使用java,你可以试试这个......

while(isPlaying){
   Thread.sleep(1);
};

答案 4 :(得分:0)

简单的方法是将sleep(1)置于其中。并且cpu的使用不会花费更多。

答案 5 :(得分:0)

你真的不需要空{}中的while loop

while(isPlaying);就足够了。

另外,正如其他人已经建议的那样,考虑在循环中使用延迟,即

  

的Thread.sleep(100); //在Java中睡眠1/10秒

或者

  

延迟(100); //在Java中使用1/10秒的lephs