我正在编写Ukelele Simulator,我想在每个字符串上播放一个音符,中间有一个短暂的延迟。目前,我有一个方法返回一个AudioClip,其中包含每个字符串上当前按下的音符的声音,我试图使用Thread.sleep()以500毫秒的延迟连续播放这些AudioClip。
public static void main(String[] args){
//test it
UkeString stringG = new UkeString('G');
UkeString stringC = new UkeString('C');
UkeString stringE = new UkeString('E');
UkeString stringA = new UkeString('A');
try{
AudioClip G = stringG.getNoteAudio();
AudioClip C = stringC.getNoteAudio();
AudioClip E = stringE.getNoteAudio();
AudioClip A = stringA.getNoteAudio();
G.play();
Thread.sleep(500);
C.play();
Thread.sleep(500);
E.play();
Thread.sleep(500);
A.play();
Thread.sleep(500);
}
catch(Exception e){
System.out.println(e);
}
return;
}
但是,我遇到了一些来自Thread.sleep()的奇怪的不正常行为。通常,当我执行上面的代码时,G.play()之后的第一个Thread.sleep()要么不执行整整500毫秒,要么根本不执行,因为' G'和' C'音符快速连续播放。在那之后,' E'和' A'音符将按预期以500毫秒的间隔播放。
真正奇怪的是,如果我在另一个实例结束之前再次运行程序(即旧实例中的注释仍在播放),那么新实例将按预期执行,所有注释以500毫秒的间隔播放。这里发生了什么?
答案 0 :(得分:1)
请参阅http://docs.oracle.com/javase/7/docs/api/java/lang/Thread.html
你的答案在这里(粗体):
导致当前正在执行的线程进入休眠状态(暂时停止 执行)指定的毫秒数,受制于 系统定时器和调度程序的精度和准确性。
换句话说,使用Thread.sleep()