有关Java线程的查询

时间:2010-11-15 09:41:32

标签: 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");
        }       

      }

}

2 个答案:

答案 0 :(得分:4)

wait()调用阻塞,直到某人notify()为止...基本上,当主线程在{{{}}阻塞时,您需要创建一个调用al.notify()的新线程1}}。

此程序打印wait(),暂停一秒,然后打印Before wait

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() 的原因

答案 1 :(得分:2)

您没有创建任何其他线程,因此很难看到如何通知主线程。但是,如果你 有另一个引用al的帖子,你会使用类似的东西:

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

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

(两者之间的区别在于notify只会唤醒单个线程等待; notifyAll将唤醒所有线程等待在那个对象上。)