2014-03-05 83 views
0

我有兩個Java類無法在線程中運行wait()方法?

public class Firstclass 
{ 
    public static void main(String args[]) throws InterruptedException 
    { 
     System.out.println("Main start...."); 
     Secondclass s=new Secondclass(); 

     Thread t1 = new Thread(s); 
     t1.setName("First Thread"); 

     Thread t2=new Thread(s); 
     t2.setName("Second Thread"); 

     t1.start(); 

     t2.start(); 
     System.out.println("Main close...");   
    } 
} 

public class Secondclass implements Runnable 
{ 
    public static Object obj; 

    int counter=10; 

    public void inc() 
    { 
     counter++; 
    } 

    public void dec() 
    { 
     counter--; 
    } 

    @Override 
    public void run() 
    { 
     try 
     { 
      loop(); 
     } 
     catch(Exception e) 
     { 
      System.out.println("exception is"+e); 
     } 
    } 

    public void loop() throws InterruptedException 
    { 
     for(int i=0;i<10;i++) 
     {    
      if(Thread.currentThread().getName().equals("First Thread")) 
      { 
       Thread.currentThread().wait(); 
       inc();     
      } 
      else 
      { 
       dec(); 
      } 
      System.out.println("Counter=="+counter); 
     } 
    } 
} 

我的第一個問題是:我想我的第一個線程等待,直到第二個線程完成,我能夠acheive這一點,但在輸出我得到例外java.lang.IllegalMonitorStateException。我不知道爲什麼。

我的第二個問題是:你能指導我任何教程網站,我可以從基礎學習等待(),通知和notifyall()方法。

+0

你是否已經開始閱讀'wait()'方法的javadoc? –

+0

@ Sotirios是的,但我一直在尋找一個實用的簡單例子。 – TruePS

+2

忘掉這個例子。瞭解它的作用。讀完javadoc後,您應該確切知道拋出異常的原因。 –

回答

2

答1: - 你需要如下使用join()方法: -

t2.start(); 
t2.join(); 

t1.start(); 
t1.join(); 

答2: - 參見本link的等待和通知的例子。

2

我想我的第一個線程等待,直到第二線程完成,我 能夠acheive這一點,但在輸出我得到異常 「java.lang.IllegalMonitorStateException'.I不知道爲什麼。

wait()方法在Object類中聲明,在Java中所有引用類型的鼻祖。因此,您可以在任何導致對象引用的表達式上調用該方法。

javadoc說以下

造成當前線程等待,直到其他線程調用 java.lang.Object.notify()方法或此對象的java.lang.Object.notifyAll() 方法。換句話說,如果該方法僅執行呼叫wait(0),則該方法的行爲與 完全相同。

當前線程必須擁有該對象的監視器。線程釋放該顯示器並等待另一個線程的 所有權通知 線程在等待這個對象監視器上或者通過 調用notify方法或notifyAll方法來喚醒。然後線程 等待,直到它可以重新獲得顯示器的所有權並恢復執行 。

因此,如果你有

Thread.currentThread().wait(); 

調用它,但你從來沒有同步(即得到了監控器)通過

Thread.currentThread() 

返回的對象,那麼你會得到那IllegalMonitorException

作爲一個附註,不要每個在Thread實例上同步。他們在生命週期結束時有一些意想不到的行爲。

解決您的問題的一種方法是爲Runnable實例提供共享的Object。每個人都試圖圍繞某個代碼塊同步該對象。另一個線程將不得不等待,直到第一個獲取顯示器的線程完成使用。

但是,不要依賴於這裏的順序。線程調度程序將決定每個線程何時運行。

你能PLZ指導我任何教程網站在那裏我可以學到wait()的,從基礎通知 和notifyAll的()方法。

如果您有任何問題,請直接撥打電話java <the thing you want>。在這種情況下,您需要查看Javadoc和Concurrency tutorials