请让我知道如何打印“等待后”;如何通过以下代码通知主线程:
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 :(得分: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
将唤醒所有线程等待在那个对象上。)