一、应用注意事项
1、wait和notify必须在synchronized中。
2、获取同一对象的监视器,才能互相唤醒。
3、为了防止监视器对象发生变化,最好单独定义一个监视器对象,不参与任何业务逻辑,例如:private final Object obj = new Object();
4、线程等待的条件不要用if,使用while判断,保证唤醒后,判断条件是否符合,因为存在无效的唤醒(唤醒你并不是条件符合才唤醒你)
5、当唤醒时,使用notifyAll方法,尽量不要使用notify方法。
二、应用事例
package test.com.concurrent;
public class NotifyWaitTest {
//不可变监视对象
private static final Object obj = new Object();
private static int num = 0;
private static void thead9(){
new Thread(new Runnable() {
@Override
public void run() {
while (num !=9){
//通过synchronized获得对象锁
synchronized (obj) {
try {
System.out.println("9号线程等待10号线程结束");
obj.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
System.out.println("9号线程开始工作");
}
},"9号线程").start();
}
private static void thread10(){
new Thread(new Runnable() {
@Override
public void run() {
synchronized (obj) {
System.out.println("10号线程工作结束");
num = 9;
obj.notifyAll();
}
}
},"10号线程").start();
}
public static void main(String[] args){
thead9();
thread10();
}
}
运行结果:
9号线程等待10号线程结束
10号线程工作
9号线程开始工作
Process finished with exit code