1.wait()
- wait()的作用是使当前执行代码的线程进行等待, 知道接到通知(notify)或者中断为止
- wait()是Object类的方法
- 当线程处于wait,调用interrupt()会出现InterruptedException
- 在调用wait()之前,线程必须获得该对象的对象级别锁
- 在调用wait()之后,线程释放锁
- wait(long),等待超过这个时间自动唤醒
2.notify()
- 在调用notify()之前,线程必须获得该对象的对象级别锁
- 在调用notify()之后,线程不会立刻释放锁,要退出synchronized代码块后才会释放锁
- 如果有多个线程等待,则由线程规划器随机选1个线程,对其发出notify
- 如果要唤醒所有线程,使用notifyAll(),可解决多生产者/消费者假死状态问题
3.实验wait/notify
3.1 调用wait()的线程
public class MyThreadOne extends Thread{
private Object lock;
public MyThreadOne(Object lock){
super();
this.lock = lock;
}
@Override
public void run(){
try{
synchronized (lock){
System.out.println("wait begin");
lock.wait();
System.out.println("wait end");
}
}catch (InterruptedException e){
e.printStackTrace();
}
}
}
3.2 调用notify()的线程
public class MyThreadTwo extends Thread {
private Object lock;
public MyThreadTwo(Object lock){
super();
this.lock = lock;
}
@Override
public void run(){
synchronized (lock){
System.out.println("notify begin");
lock.notify();
System.out.println("notify end");
}
}
}
3.3 测试类
public class Test {
public static void main(String[] args) {
try{
Object lock = new Object();
MyThreadOne t1 = new MyThreadOne(lock);
t1.start();
Thread.sleep(2000);
MyThreadTwo t2 = new MyThreadTwo(lock);
t2.start();
}catch (InterruptedException e){
e.printStackTrace();
}
}
}
3.4 结果