java编程思想笔记-并发之线程协作(三)
2017-08-10 22:14
363 查看
Condition类简介
使用互斥并允许任务挂起的基本类是Condition,可以使用Condition上的await()来挂起一个任务,可以使用signal()通知一个任务,signalAll()唤醒所有在这个Condition上挂起的任务,与notifyAll()相比,signalAll()是更安全的方式,同时任务在调用await(),signal()或者signalAll()必须拥有这个锁
使用concurrent类库的Condition重写汽车打蜡抛光的例子
使用互斥并允许任务挂起的基本类是Condition,可以使用Condition上的await()来挂起一个任务,可以使用signal()通知一个任务,signalAll()唤醒所有在这个Condition上挂起的任务,与notifyAll()相比,signalAll()是更安全的方式,同时任务在调用await(),signal()或者signalAll()必须拥有这个锁
使用concurrent类库的Condition重写汽车打蜡抛光的例子
package com.tij.thread.cooperate; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.TimeUnit; import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; class Car2 { private Lock lock = new ReentrantLock(); //使用lock创建一个condition对象,管理任务通信 private Condition condition = lock.newCondition(); private boolean waxOn = false; public void waxed() { lock.lock(); //使用try-finally保证在所有情况下释放锁 try { waxOn = true; condition.signalAll(); } finally { lock.unlock(); } } public void buffed() { lock.lock(); try { waxOn = false; condition.signalAll(); } finally { lock.unlock(); } } // 必须让线程获取锁线程才能wait public void waitForWaxing() throws InterruptedException { lock.lock(); try { while (!waxOn) { condition.await(); } } finally { lock.unlock(); } } // 必须让线程获取锁线程才能wait public void waitForBuffing() throws InterruptedException { lock.lock(); try { while (waxOn) { condition.await(); } } finally { lock.unlock(); } } } class WaxOn2 implements Runnable { private Car car; public WaxOn2(Car car) { this.car = car; } @Override public void run() { try { while (!Thread.interrupted()) { System.out.println(" Wax On "); TimeUnit.MILLISECONDS.sleep(200); car.waxed(); car.waitForBuffing(); } } catch (InterruptedException e) { System.out.println("WaxOn Exiting via interrupt "); } System.out.println(" Ending Wax On task "); } } class WaxOff2 implements Runnable { private Car car; public WaxOff2(Car car) { this.car = car; } @Override public void run() { try { while (!Thread.interrupted()) { car.waitForWaxing(); System.out.println(" Wax Off ! "); TimeUnit.MILLISECONDS.sleep(200); car.buffed(); } } catch (Exception e) { System.out.println("WaxOff Exiting via interrupt "); } System.out.println(" Ending Wax Off task "); } } public class WaxOMatic2 { public static void main(String[] args) throws InterruptedException { Car car = new Car(); ExecutorService exec = Executors.newCachedThreadPool(); exec.execute(new WaxOff(car)); exec.execute(new WaxOn(car)); TimeUnit.SECONDS.sleep(5); exec.shutdownNow(); } }
相关文章推荐
- (38)21.3.8 线程本地存储---Java编程思想之并发笔记
- java编程思想之并发(线程之间的协作)
- java编程思想笔记-并发之线程加入
- (28)21.3.2 解决共享资源竞争---Java编程思想之并发笔记
- Java并发学习笔记(13)线程之间的协作(Object.wait(),notifu(),notifyAll() Thread.join())
- (39)21.4 终结任务---Java编程思想之并发笔记
- (35)21.3.6 在其它对象上同步---Java编程思想之并发笔记
- Java并发编程实践笔记之—线程
- java线程学习(二)—并发编程实践学习笔记
- 编程实践笔记{Java 线程 并发处理 Webservice}(转)
- 编程实践笔记{Java 线程 并发处理 Webservice}
- Java并发编程实践笔记之—线程封闭(Thread Confinement)
- (32)21.3.4 原子类---Java编程思想之并发笔记
- Java并发编程:线程间协作的两种方式:wait、notify、notifyAll和Condition
- (45)21.4.3 并发 练习 19---Java编程思想之并发笔记
- (43)21.4.3 中断---Java编程思想之并发笔记
- (29)21.3.3 原子性与易变性---Java编程思想之并发笔记
- (27)21.3.1 不正确的访问资源---Java编程思想之并发笔记
- Java并发编程:线程间协作的两种方式:wait、notify、notifyAll和Condition
- (40)21.4.1 装饰性花园---Java编程思想之并发笔记