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

时间:2015-04-18 08:55:53

标签: java android multithreading thread-safety thread-sleep

考虑这个代码基本上有一个对象(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?)

2 个答案:

答案 0 :(得分:0)

简单回答:Android不是实时操作系统。

答案 1 :(得分:0)

其中一个原因是,OS在wait()中提供的时间(ms)将该线程置于挂起模式。当时间结束时,不会保证您的线程将立即执行,因为OS已在您的进程中分配了另一个具有更高优先级的线程以由处理器执行,或者某个其他更高优先级的进程正被分配给处理器执行。即使你的线程处于最高优先级,即使这样,有时也会因为上下文切换而导致延迟。在Java案例中,GC。