线程通信升级版

来源:互联网 发布:买卖时机软件下载 编辑:程序博客网 时间:2024/03/29 01:34
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;}@Overridepublic 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();}}

0 0
原创粉丝点击