在Java中使用AudioClip时,睡眠行为不一致

时间:2014-12-07 20:04:00

标签: java multithreading sleep

我正在编写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毫秒的间隔播放。这里发生了什么?

1 个答案:

答案 0 :(得分:1)

请参阅http://docs.oracle.com/javase/7/docs/api/java/lang/Thread.html

你的答案在这里(粗体):

  

导致当前正在执行的线程进入休眠状态(暂时停止   执行)指定的毫秒数,受制于   系统定时器和调度程序的精度和准确性

换句话说,使用Thread.sleep()

时,你不可能有那么多精细控制