为什么 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。
考虑这段代码,基本上有一个对象(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。