2010-11-15 35 views
1

請讓我知道我可以如何打印「等待後」;我怎麼能在下面的代碼通知主線程:關於Java主題的查詢

import java.util.*; 

public class Test { 

     public static void main(String[] args) throws InterruptedException { 
      ArrayList al = new ArrayList(6); 
      al.add(0, "abc"); 
     al.add(1, "abc"); 
     al.add(2, "abc"); 
     synchronized(al){ 
      System.out.println("Before wait"); 
      al.wait(); 
      System.out.println("After wait"); 
     }  

     } 

} 
+0

由於其他答案更全面地解釋,「wait()」不是一個睡眠呼叫。 – 2010-11-15 09:48:31

回答

4

wait()呼叫阻塞,直到有人notify()的IT ...基本上,你需要創建一個新的線程調用al.notify()當主線程被阻塞在wait()

這個程序打印Before wait,暫停1秒,並打印After wait

import java.util.ArrayList; 

public class Test { 

    public static void main(String[] args) throws InterruptedException { 

     final ArrayList al = new ArrayList(6); 
     al.add(0, "abc"); 
     al.add(1, "abc"); 
     al.add(2, "abc"); 

     // Start a thread that notifies al after one second. 
     new Thread() { 
      public void run() { 
       try { 
        Thread.sleep(1000); 
       } catch (InterruptedException e) { 
        e.printStackTrace(); 
       } 

       synchronized (al) { 
        al.notify();  // <-- this "releases" the wait. 
       } 
      } 
     }.start(); 

     synchronized (al) { 
      System.out.println("Before wait"); 
      al.wait(); 
      System.out.println("After wait"); 
     } 
    } 
} 

這裏是我以前的一個答案,解釋爲什麼wait()notify()必須同時握住顯示器的鎖執行的鏈接。

+0

你必須添加嘗試圍繞al.wait()以及...但除此之外,它是完美的。 :) – dirbacke 2010-11-15 09:55:10

+1

不,OP在主方法中已經有'throws InterruptedException'。 – aioobe 2010-11-15 10:02:43

+0

因此,只有當您的線程具有對象監視器時,等待通知纔有效。感謝您的幫助 – GamDroid 2010-11-15 10:04:22

2

你沒有創建任何其他線程,所以這是很難看到有什麼要通知主線程。但是,如果您沒有有另一個線程它有一個參考al,你會使用類似:

synchronized(al) { 
    al.notify(); 
} 

synchronized(al) { 
    al.notifyAll(); 
} 

(這兩者之間的區別是,notify只會喚醒一個單個線程從等待; notifyAll將喚醒全部等待該對象的線程。)