java wait api_Java多线程_wait/notify/notifyAll方法

关于这三个方法,我们可以查询API得到下列解释:

wait():导致当前的线程等待,直到其他线程调用此对象的notify( ) 方法或 notifyAll( ) 方法或者指定的事件用完

notify():唤醒在此对象监视器上等待的单个线程

notifyAll():唤醒在此对象监视器上等待的所有线程

我们需要注意的点

(1)wait()、notify/notifyAll() 方法是Object的本地final方法,无法被重写。

(2)wait() 与 notify/notifyAll 方法必须在同步代码块中使用。

(3)由于 wait() 与 notify/notifyAll() 是放在同步代码块中的,因此线程在执行它们时,肯定是进入了临界区中的,即该线程肯定是获得了锁的。

(4)当线程执行wait()时,会把当前的锁释放,然后让出CPU,进入等待状态。

(5)当执行notify/notifyAll方法时,会唤醒一个处于等待该 对象锁 的线程,然后继续往下 执行,直到执行完退出对象锁锁住的区域(synchronized修饰的代码块)后再释放锁。

(6)如果在执行wait() 与 notify/notifyAll() 之前没有获得相应的对象锁,就会抛出:java.lang.IllegalMonitorStateException异常。

下面我们看代码:

public classWaitNotifyDemo {public static voidmain(String[] args) {

Object lock= newObject();

WaitMathodThread w= newWaitMathodThread(lock);

w.start();

NotifyMethodThread n= newNotifyMethodThread(lock);

n.start();

}public voidwaitMethod(Object lock) {try{synchronized(lock) {

System.out.println("begin wait() ThreadName=" +Thread.currentThread().getName());

lock.wait();

System.out.println(" end wait() ThreadName=" +Thread.currentThread().getName());

}

}catch(InterruptedException e) {

e.printStackTrace();

}

}public voidnotifyMethod(Object lock) {try{synchronized(lock) {

System.out.println("begin notify() ThreadName=" + Thread.currentThread().getName() + " time="

+System.currentTimeMillis());

lock.notify();

Thread.sleep(5000);

System.out.println(" end notify() ThreadName=" + Thread.currentThread().getName() + " time="

+System.currentTimeMillis());

}

}catch(InterruptedException e) {

e.printStackTrace();

}

}

}class WaitMathodThread extendsThread {privateObject lock;publicWaitMathodThread(Object lock) {super();this.lock =lock;

}

@Overridepublic voidrun() {

WaitNotifyDemo wnd= newWaitNotifyDemo();

wnd.waitMethod(lock);

}

}class NotifyMethodThread extendsThread {privateObject lock;publicNotifyMethodThread(Object lock) {super();this.lock =lock;

}

@Overridepublic voidrun() {

WaitNotifyDemo wnd= newWaitNotifyDemo();

wnd.notifyMethod(lock);

}

}

运行结果:

8aab0902142030a8b06dbc953881f8bc.png

从这个测试中可以看出调用了wait()方法后会立即释放锁,线程进入等待状态,而调用了notify()方法后并不会立即释放锁,会等到走完synchronized修饰的临界区时,才会释放锁。

所以一般在调用了notify()方法后最好马上退出synchronized修饰的临界区。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值