一、Clerk2类:
package com.yao.thread.syn;import java.util.concurrent.locks.Condition;import java.util.concurrent.locks.Lock;import java.util.concurrent.locks.ReentrantLock;public class Clerk2 { private int product = -1; //-1表示没有任何产品 private Lock lock = new ReentrantLock(); private Condition condition = lock.newCondition(); public void setProduct(int product){ try{ lock.lock(); while (this.product != -1) { try { condition.await(); } catch (InterruptedException e) { throw new RuntimeException(e); } } this.product = product; System.out.printf("生产者设定 %d %n",this.product); condition.signal(); }finally{ lock.unlock(); } } public int getProduct(){ try{ lock.lock(); while (this.product == -1) { try { condition.await(); } catch (InterruptedException e) { throw new RuntimeException(); } } int temp = this.product; System.out.printf("消费者取走 %d %n",temp); this.product = -1; condition.signal(); return temp; }finally{ lock.unlock(); } }}
二、Producter2类:
package com.yao.thread.syn;public class Producter2 implements Runnable { private Clerk2 clerk; public Producter2(Clerk2 clerk){ this.clerk = clerk; } @Override public void run() { System.out.println("生产者开始产生整数"); for (int i = 0 ; i < 10 ; i++) { try { Thread.sleep((int)(Math.random()*3000)); } catch (InterruptedException e) { e.printStackTrace(); } clerk.setProduct(i); } }}
三、Consumer2类:
package com.yao.thread.syn;public class Consumer2 implements Runnable { private Clerk2 clerk; public Consumer2(Clerk2 clerk){ this.clerk = clerk; } @Override public void run() { System.out.println("消费都可以消费整数"); for (int i = 0 ; i < 10 ; i++) { try { Thread.sleep((int)(Math.random()*3000)); } catch (InterruptedException e) { e.printStackTrace(); } clerk.getProduct(); } }}
四、演示类:
package com.yao.thread.syn;public class ConsumerProducterDemo2 { public static void main(String[] args) { Clerk2 clerk2 = new Clerk2(); Consumer2 consumer = new Consumer2(clerk2); Producter2 producter = new Producter2(clerk2); new Thread(consumer).start(); new Thread(producter).start(); }}
这里的实现方式和传统的差不多一样,效率也差不多,只不过灵活许多。