package com.huowolf; /* * jdk1.5升级版线程通信示例 * 将同步中的 synchronized替换成显示的Lock操作 * 将Object中的wait().notify(),notify() ,替换成了Condition对象的方法, * 该对象可以由Lock锁,进行获取。 * *本例中,实现了本方只唤醒对方的操作。
*达到生成一次消费一次的目的 */ import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; class Resource { private String name; private int count = 1; private boolean flag =false; private Lock lock = new ReentrantLock();//一个可重入的互斥锁定 Lock private Condition condition_pro = lock.newCondition();//Condition 替代了 Object 监视器方法的使用 private Condition condition_con = lock.newCondition(); public void set(String name) throws Exception { lock.lock(); try{ while(flag) { condition_pro.await(); } this.name = name+"--"+count++; System.out.println(Thread.currentThread().getName()+"...生产者..."+this.name); flag = true; condition_con.signal(); } finally { lock.unlock(); } } public void out() throws Exception { lock.lock(); try { while(!flag) { condition_con.await(); } System.out.println(Thread.currentThread().getName()+"...消费者..."+this.name); flag = false; condition_pro.signal(); } finally{ lock.unlock(); } } } class Producer implements Runnable { private Resource res; public Producer(Resource res) { this.res = res; } public void run() { while(true) { try { res.set("商品"); } catch (Exception e) { e.printStackTrace(); } } } } class Consumer implements Runnable { private Resource res; public Consumer(Resource res) { this.res = res; } @Override public void run() { while(true) { try { res.out(); } catch (Exception e) { e.printStackTrace(); } } } } public class ProducerConsumerDemo { public static void main(String[] args) { Resource r = new Resource(); Producer pro = new Producer(r); Consumer con = new Consumer(r); Thread t1 = new Thread(pro); Thread t2 = new Thread(pro); Thread t3 = new Thread(con); Thread t4 = new Thread(con); t1.start(); t2.start(); t3.start(); t4.start(); } }
原文地址:http://blog.csdn.net/huolang_vip/article/details/41116147