首页 > 代码库 > 线程通信升级版

线程通信升级版

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();

	}

}

线程通信升级版