2015-04-18 33 views
0

考慮下面的代碼,其基本上具有一個對象(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?)

+0

歡迎併發編程:) –

+0

好吧,Java代碼虛擬機上運行,​​你知道的。它無法控制處理器將給你的線程多少實際時間。 – mkrakhin

+0

因爲在說明書中沒有其他說法。所以不要依賴它。 – EJP

回答

0

簡單的答案:Android不是一個實時操作系統。

0

其中一個原因是,OS把該線程掛起模式爲你在wait()提供時間(ms)。當時間完成它不是guarrented你的線程會立刻因爲OS已經分配在過程中具有較高優先級的另一個線程被處理器或其他一些高優先級的進程被分配給處理器以供執行執行執行。即使您的線程處於最高優先級,即便如此,由於Java中的上下文切換&,GC也會有一些延遲。

相關問題