为什么 object.wait(value) 不准确?

why object.wait(value) is not accurate?

考虑这段代码,基本上有一个对象(WaitedObject)和两个线程(SomeTask 和 SomeTaskWithWait)竞争同步调用对象的方法(分别为 longRunningTask() 和 withWaitTask())

package closerLookAtWait;
class WaitedObject
{
    int i=0;
    synchronized void longRunningTask()
    {

            System.out.println(i++);
            for(long j=999; j>0; j--)
            {}
    }
    synchronized void withWaitTask()
    {

            System.out.println("Now Waiting");
            long time1 = System.currentTimeMillis();
            try {
                //Thread.sleep(500);
                wait(50);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            long time2 = System.currentTimeMillis() - time1;
            System.out.println("Done Waiting for "+time2);

    }
}
class SomeTask implements Runnable
{
    WaitedObject wo;
    SomeTask(WaitedObject wo)
    {
        this.wo = wo;
    }
    @Override
    public void run() {

        while(true)
            wo.longRunningTask();
    }
}
class SomeTaskWithWait implements Runnable{

    WaitedObject wo;
    SomeTaskWithWait(WaitedObject wo)
    {
        this.wo = wo;
    }
    @Override
    public void run() {
        while(true)
        wo.withWaitTask();
    }
}
public class SomeWaitingWithLong {

    public static void main(String[] args) {
        WaitedObject wo = new WaitedObject();
        new Thread(new SomeTask(wo)).start();
        new Thread(new SomeTaskWithWait(wo)).start();
    }

}

示例输出:

我得到的输出是 54,54,50,65,51,52,..,78,..84,..50,52,52.

现在我的问题是为什么如此不准确? (即使是 65 也可以,但为什么是 84?)

简单回答:Android 不是实时 OS。

其中一个原因是,OS 在您在 wait() 中提供的时间(毫秒)内将该线程置于挂起模式。当时间结束时,不保证您的线程将立即执行,因为 OS 已在您的进程中分配了另一个具有更高优先级的线程,由处理器执行或其他一些更高优先级的进程被分配给执行的处理器。即使您的线程处于最高优先级,有时也会因为上下文切换而出现一些延迟,在 Java 的情况下,GC。