线程之间的协作wait/notify
来源:互联网 发布:淘宝分享送红包在哪找 编辑:程序博客网 时间:2024/06/05 16:44
当线程任务之间需要进行协作时,关键是要考虑这些任务之间的握手。为实现任务之间的握手,我们可以使用基础特性:互斥。互斥可以确保另有一个任务对某个信号进行响应,这样就可以根除任务之间对某个资源的竞争条件。我们可以提供一途径,任务可以将自身挂起,直到某一个外部条件发生变化时,可以让这个任务重新唤醒继续执行,这个种挂起,唤醒的关系,我们可以使用通过Object类的wait()和notify()/notifyAll()方法来实现。
调用wait()方法时,会释放锁而挂起任务自身,直到另一个任务调用notify()或notifyAll()方法来唤醒wait()挂起的任务,这样wait()挂起的任务可以继续执行。
例子:
一个任务将蜡涂到Car上,一个抛光它。抛光任务在涂蜡任务完成之前,是不能执行基工作的,而涂蜡任务在涂另一层蜡之前,必须等抛光任务完成。WaxOn和WaxOff都使用了Car对象,该对象在这些任务等待条件变化的时候,使用wait()和notifyAll()来挂起和重新启动这些任务:
class Car { //表示是否上蜡private boolean waxOn = false;public synchronized void waxed(){waxOn = true; //ready to buffednotifyAll();}public synchronized void buffed(){waxOn = false; //ready for another coat to waxnotifyAll();}public synchronized void waitForWaxing() throws InterruptedException{while(!waxOn){wait();}}public synchronized void waitForBuffing() throws InterruptedException{while(waxOn){wait();}}}class WaxOn implements Runnable{private Car car;public WaxOn(Car car){this.car = car;}@Overridepublic void run() {try {while(!Thread.interrupted()){System.out.println("Wax On.");//TimeUnit.MILLISECONDS.sleep(200);Thread.sleep(200);car.waxed();car.waitForBuffing();}} catch (InterruptedException e) {System.err.println("exiting WaxOn interrupt.");}System.out.println("ending wax on task.");}}class WaxOff implements Runnable{private Car car;public WaxOff(Car car){this.car = car;}@Overridepublic void run() {try {while(!Thread.interrupted()){System.out.println("Wax Off.");car.waitForWaxing();//TimeUnit.MILLISECONDS.sleep(200);Thread.sleep(200);car.buffed();}} catch (InterruptedException e) {System.err.println("exiting WaxOff interrupt");}System.out.println("ending wax off task.");}}
public class WaxOMatic{public static void main(String[] args) throws InterruptedException{Car car = new Car();/*ExecutorService es = Executors.newCachedThreadPool();es.execute(new WaxOff(car));es.execute(new WaxOn(car));TimeUnit.SECONDS.sleep(5);es.shutdownNow();//shutdown all taskl*/Thread t1 = new Thread(new WaxOff(car));Thread t2 = new Thread(new WaxOn(car));t1.start();t2.start();Thread.sleep(4000);t1.interrupt();t2.interrupt();}}
0 0
- 线程之间的协作wait/notify
- 初阶并发编程之——运用wait()与notify()实现线程之间的协作
- java中线程的协作sleep yield wait 和 notify
- Java 线程间的协作(wait/notify/sleep/yield/join)
- 线程间协作wait()与notify()
- JAVA线程间协作:wait.notify.notifyAll
- 线程间协作:wait、notify、notifyAll
- 11、线程间协作wait notify
- 线程间协作:wait、notify、notifyAll
- JAVA线程间协作:wait.notify.notifyAll
- 线程之间通信 wait notify
- java 多线程 线程之间的协作 notify()和notifyAll()
- jvm的线程之间的通信-notify-wait-notifyAll
- java 线程之间的协作 wait()与notifyAll()
- Java 多线程 线程之间的协作 wait()和notifyAll()
- Thread:线程之间的通信,使用wait()和notify()
- 用java来实现线程之间的wait、notify()通信
- 线程之间的同步和通信,synchronized,wait(),notify(),notifyAll()
- List,Set,Map用法以及区别
- VC6代码升级到高版本问题总结版
- 深度优先搜索DFS(邻接表实现)
- Linux入门:定制“Icon”样式
- 1维KD-Tree查找指定范围内的元素
- 线程之间的协作wait/notify
- 混合高斯模型(GMM)实现
- 子序列个数(fzu2129)
- 分布式系统的事务处理
- 邻接矩阵实现BFS广度优先搜索
- SQL语句备份和还原数据库
- Linux入门:定制“资源管理器”样式
- 邻接表实现BFS广度优先搜索
- 最近的想法整理下