1、wait()函数
当一个线程调用一个共享变量的wait()方法时,该调用线程会被阻塞挂起,直到发生下面几件事情之一才返回:
- 其他线程调用了该共享对象的notify()或者notifyAll()方法;
- 其他线程调用了该线程的interupt()方法,该线程抛出InteruptedException异常返回。
另外需要注意的是,如果调用wait)方法的线程没有事先获取该对象的监视器锁,则调用wait()方法时调用线程会抛出illegalMonitorStateException异常。
那么一个线程如何才能获取一个共享变量的监视器锁呢?
-
执行synchronized同步代码块时,使用该共享变量作为参数。
synchronized(共享变量){ //doSomething }
-
调用该共享变量的方法,并且该方法使用了synchronized修饰。
synchronized void add(int a,int b){ //doSomething }
另外需要注意的是,一个线程可以从挂起状态变为可以运行状态(也就是被唤醒),即使该线程没有被其他线程调用notify()、notifyAll()方法进行通知,或者被中断,或者等待超时,这就是所谓的虚假唤醒。
还需要注意的是,当前线程调用共享变量的wait)方法后只会释放当前共享变量上的锁,如果当前线程还持有其他共享变量的锁,则这些锁是不会被释放的。
package thread;
public class Wait01 {
//创建共享资源
private static volatile Object resourceA = new Object();
private static volatile Object resourceB = new Object();
public static void main(Strin