JAVA同步-生产者与消费者实现 三
生产者消费者模型:
实现手段:在Condition类中 await()和 signalAll()方法实现:这种方式类似于 wait()和notifAll()的方法,但是此类方法实现 有新特性,引入了Lock机制,动态的控制锁机制,来完成临界资源同步的线程运行;
问题描述:汽车打蜡抛光问题:一个汽车先打蜡再抛光也可以多次重复操作!
打蜡未完成时不能抛光,完成后通知抛光人员,才能抛光!
抛光未完成时不能打蜡,完成后通知打蜡人员,才能打蜡!
图示:
代码描写:
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 Car { private Lock lock = new ReentrantLock(); private Condition condition = lock.newCondition(); private boolean WaxOn = false; //打蜡操作: public void waxed() { this.lock.lock(); // 加锁 try { this.WaxOn = true;//打蜡完成:即可以抛光 this.condition.signalAll();//通知可以抛光 } finally { this.lock.unlock();//解锁 } } //抛光操作: public void buff() { this.lock.lock(); try { this.WaxOn = false;// 抛光完成:即可以打蜡 this.condition.signalAll();//通知可以打蜡 } finally { this.lock.unlock(); } } //等待打蜡操作: public void waitingForWax() throws InterruptedException { this.lock.lock(); try { while (this.WaxOn == false) this.condition.await(); } finally { lock.unlock(); } } //等待抛光操作: public void watingForBuffed() throws InterruptedException { this.lock.lock(); try { while (this.WaxOn == true) this.condition.await(); } finally { this.lock.unlock(); } } }
打蜡类:
//打蜡线程:打蜡操作--通知抛光 class WaxOn implements Runnable { private Car car; public WaxOn(Car car) { this.car = car; } public void run() { try { while (!Thread.interrupted()) { System.out.print("Wax on!!"); TimeUnit.MILLISECONDS.sleep(200); this.car.waxed(); this.car.watingForBuffed(); } } catch (Exception e) { e.printStackTrace(); // System.out.println("Exiting via interrupted"); } System.out.println("Ending Wax On task"); } }
抛光类:
//抛光线程:抛光操作--通知打蜡 class WaxOff implements Runnable { private Car car; public WaxOff(Car car) { this.car = car; } public void run() { try { while (!Thread.interrupted()) { car.waitingForWax(); System.out.println("Wax Off!!"); TimeUnit.MILLISECONDS.sleep(200); car.buff(); } } catch (Exception e) { e.printStackTrace(); // System.out.println("Exiting via interrupted"); } System.out.println("Ending Wax Off task"); } }
线程启动:
public class WaxOnMatic2 { public static void main(String[] args) throws InterruptedException { Car car = new Car(); ExecutorService exec = Executors.newCachedThreadPool(); exec.execute(new WaxOn(car)); exec.execute(new WaxOff(car)); TimeUnit.SECONDS.sleep(5); exec.shutdownNow(); } }
运行结果:线程打断操作,随机结束线程!