Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/179.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么object.wait(值)不准确?_Java_Android_Multithreading_Thread Safety_Thread Sleep - Fatal编程技术网

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

Java 为什么object.wait(值)不准确?,java,android,multithreading,thread-safety,thread-sleep,Java,Android,Multithreading,Thread Safety,Thread Sleep,考虑这段代码,它基本上有一个对象(WaiteObject)和两个线程(SomeTask和SomeTaskWithWait)竞争同步调用对象的方法(分别是longRunningTask()和withWaitTask()) package closerLookAtWait; class WaitedObject { int i=0; synchronized void longRunningTask() { System.out.println(i+

考虑这段代码,它基本上有一个对象(WaiteObject)和两个线程(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不是实时操作系统。

原因之一是,操作系统在
等待()中提供的时间(ms)内将线程置于挂起模式。当时间结束时,并不保证您的线程会立即执行,因为操作系统已经在您的进程中分配了另一个具有更高优先级的线程供处理器执行,或者其他一些更高优先级的进程被分配给处理器执行。即使您的线程处于最高优先级,但由于上下文切换,有时也会有一些延迟&在Java的例子中,GC。

欢迎使用并发编程:)您知道,Java代码在虚拟机上运行。它无法控制处理器将给线程多少实际时间,因为规范中没有其他规定。所以不要依赖它。