基本用法
1.object.wait();等待object被唤醒
2.object.notify();随机唤醒一个等待object的线程
3.object.notifyAll();唤醒所有等待object的线程
4.使用wait()方法会抛出InterruptedException
5.使用这三个方法需要在外部对object对象加锁否则会抛出IllegalMonitorStateException异常
private static Object object = new Object();
public static class TestThread extends Thread{
@Override
public void run() {
for (int i = 0; i < 3; i++) {
System.out.println("A");
}
try {
synchronized (object) {
object.wait();
}
} catch (InterruptedException e) {
e.printStackTrace();
}
for (int i = 0; i < 3; i++) {
System.out.println("B");
}
}
}
public static void main(String[] args) {
Thread thread = new TestThread();
thread.start();
Thread thread1 = new TestThread();
thread1.start();
Scanner scanner = new Scanner(System.in);
System.out.println("输入点什么就唤醒");
scanner.nextLine();
synchronized (object){
object.notify();
}
synchronized (object) {
object.notifyAll();
}
}
过程
在等待和唤醒时都发生了什么?
1、调用wait()后线程会从RUNNABLE状态转为waiting状态,进入等待集;
2、object.wait()方法首先会释放object的锁,不影响其他线程抢object的锁,并进入等待集,直到有人唤醒该线程,wait()方法会再次对object加锁。
3、如果有多个线程等待object,object.notify()会将等待object的线程中的随机一个唤醒,而notifyAll会唤醒所有等待object的线程。