读书人

施用显式的Lock和Condition

发布时间: 2012-11-04 10:42:42 作者: rapoo

使用显式的Lock和Condition

package star20110715;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;public class WaxOMatic2 {public static void main(String[] args) throws InterruptedException{Car car = new Car();ExecutorService executorService = Executors.newCachedThreadPool();executorService.execute(new waxOn(car));executorService.execute(new Buffer(car));TimeUnit.SECONDS.sleep(30);executorService.shutdownNow();}}class Car{private Lock lock = new ReentrantLock();private Condition condition = lock.newCondition();private boolean waxOn = false;public void waxed(){lock.lock();try {waxOn = true;System.err.println("正在打蜡");condition.signalAll();} finally{lock.unlock();}}public void buffered(){lock.lock();try {waxOn = false;System.err.println("正在抛光");condition.signalAll();} finally{lock.unlock();}}public void waitWax() throws InterruptedException{lock.lock();try {while(waxOn == false){condition.await();}} finally{lock.unlock();}}//如果车子现在已经打蜡了,那么车子现在就要等待啊。public void waitBuffer() throws InterruptedException{lock.lock();try {while(waxOn == true){condition.await();}} finally{lock.unlock();}}}class waxOn implements Runnable{private Car car;public waxOn(Car car) {this.car = car;}@Overridepublic void run() {try {while(!Thread.interrupted()){System.out.println("开始打蜡");car.waxed();TimeUnit.SECONDS.sleep(3);car.waitBuffer();}} catch (InterruptedException e) {System.out.println("打蜡结束");}}}class Buffer implements Runnable{private Car car;public Buffer(Car car) {this.car = car;}@Overridepublic void run() {try {while(!Thread.interrupted()){car.waitWax();System.out.println("开始抛光");car.buffered();TimeUnit.SECONDS.sleep(3);}} catch (InterruptedException e) {System.out.println("抛光结束");}}}
?

读书人网 >编程

热点推荐