2010-11-15 47 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将唤醒全部等待该对象的线程。)