java thread通知_Java多线程之《等待/通知机制》

经典范式:

等待方遵循如下原则:

1、获取对象的锁。

2、如果条件不满足,那么调用对象的wait()方法,被通知后仍要检查条件。

3、条件满足则执行对应的逻辑任务。

伪代码如下:synchronized(对象) {

while(条件不满足) {

对象.wait();

}

完成任务逻辑

}

通知方遵循如下原则:

1、获得对象的锁。

2、改变条件。

3、通知所有等待在对象上的线程。

伪代码如下:synchronized(对象) {

改变对象

对象.notifyAll();

}

示例代码:import java.text.SimpleDateFormat;import java.util.Date;/**

* 线程等待/通知机制

* Created by peng on 2018/7/22.

*/public class WaitNotify {

private static boolean flag = true; private static Object lock = new Object(); public static void main(String[] args) {

Thread waitThread = new Thread(new Wait(), "WaitThread");

waitThread.start();

SleepUtils.second(1);

Thread notifyThread = new Thread(new Notify(), "NotifyThread");

notifyThread.start();

} private static class Wait implements Runnable {

@Override

public void run() { // 加锁,拥有lock的Monitor

synchronized (lock) { // 当条件不满足时,继续wait,同时释放了lock的锁

while (flag) {

try {

System.out.println(Thread.currentThread() + " flag is true. wait @ "

+ new SimpleDateFormat("HH:mm:ss").format(new Date()));

lock.wait();

} catch (InterruptedException e) {

e.printStackTrace();

}

} // 条件满足时,完成工作

System.out.println(Thread.currentThread() + " flag is false. running @ "

+ new SimpleDateFormat("HH:mm:ss").format(new Date()));

}

}

}

private static class Notify implements Runnable {

@Override

public void run() { // 加锁,拥有lock的Monitor

synchronized (lock) {

System.out.println(Thread.currentThread() + " hold lock. notify @ "

+ new SimpleDateFormat("HH:mm:ss").format(new Date()));

lock.notifyAll();

flag = false;

SleepUtils.second(5);

} // 再次加锁

synchronized (lock) {

System.out.println(Thread.currentThread() + " hold lock again. sleep @ "

+ new SimpleDateFormat("HH:mm:ss").format(new Date()));

SleepUtils.second(5);

}

}

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值