考慮下面的代碼,其基本上具有一個對象(WaitedObject)和兩個線程(SomeTask和SomeTaskWithWait)競爭,以調用對象同步爲什麼object.wait(值)不準確?
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();
}
}
樣本輸出的(分別longRunningTask()和withWaitTask())的方法:
以及我得到的輸出爲54,54,50,65,51,52,..,78,.. 84,.. 50,52,52。
現在我的問題是爲什麼這樣的不準確? (甚至65是好的,但爲什麼84?)
歡迎併發編程:) –
好吧,Java代碼虛擬機上運行,你知道的。它無法控制處理器將給你的線程多少實際時間。 – mkrakhin
因爲在說明書中沒有其他說法。所以不要依賴它。 – EJP