同步函数 生产者和消费者模式 加强版(多人生产和多人消费)

曾经搞了半天, 生产者和消费者模式  加强版(多人生产 多人消费 ).. 

以前的代码格式就不再吐槽了(以后努力改进)

//输出结果是一个无限循环

import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

/**
 * 多个生产者&多个消费者模式
 * 多个生产者不断生产,多个消费者不停的消费
 */
public class LockConditionDemo1 {
  public static void main(String[] args) {
    Resource2 r = new Resource2();
    Producer2 p = new Producer2(r);
    Consumer2 c = new Consumer2(r);
    new Thread(p,"生产者0").start();
    new Thread(p,"生产者1").start();
    new Thread(p,"生产者2").start();
    new Thread(p,"生产者3").start();
    new Thread(c,"消费者4").start();
    new Thread(c,"消费者5").start();
    new Thread(c,"消费者6").start();
    new Thread(c,"消费者7").start();
	}
}
//创建数据源
class Resource2{
  private String name;
  private int num=1;
  public String getName() {
	return name;
  }
  public void setName(String name) {
	this.name = name;
  }
  public int getNum() {
	return num;
  }
  Lock lock = new ReentrantLock();
  //创建
  Condition con_pro = lock.newCondition();
  Condition con_con = lock.newCondition();
  Condition  c= lock.newCondition();
  //创建标记
  boolean flag = false;//true 有,fasle没有
  int[] arr=  new int[5];
  int start,end,count;
  //生产者不断的生产
  public void produce() throws InterruptedException{
	Thread.sleep(300);
	lock.lock();
	try{
	  while(count==arr.length){//此处要用while进行判断,不然会概率出现错误
		//con_pro.await();
		c.await();
	}
		//arr[start] = x; 
	if (++start == arr.length) start = 0;
		//this.setName("烤鸭"+num);
		this.setName("烤鸭");
		//System.out.println(Thread.currentThread().getName()+"---生产者生产了:"+this.getName());
		System.out.println(Thread.currentThread().getName()+"-生产者生产了:"+(count+1));
		num++;
		++count;
		//flag = true;
		//con_con.signalAll();
		c.signalAll();
		
		}finally{
			lock.unlock();
		}
	}
	//消费中不断的消费
	public void consume() throws InterruptedException{
		Thread.sleep(300);
		lock.lock();
		try{
			while(count == 0){
				//con_con.await();
				c.await();
			}
		if (++end == arr.length) end = 0;
		//this.setName("烤鸭"+num);//不能有//不然num会增加了一个.因为生产完num++了
		//System.out.println(Thread.currentThread().getName()+"===========消费者消费了:"+this.getName());
		System.out.println(Thread.currentThread().getName()+"====消费者消费了:"+count);
		//num++;//不能增加
		--count;
		//flag = false;
		//con_pro.signalAll();
		c.signalAll();
		}finally{
			lock.unlock();
		}
	}
}
//生产者类
class Producer2 implements Runnable{
	Resource2 r;
	Producer2(Resource2 r){
		this.r=r;
	}

	@Override
	public void run() {
		while(true){//此处要用while进行判断,不然会概率出现错误
			try {
				r.produce();
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	}
}
//消费者类
class Consumer2 implements Runnable{
	Resource2 r;
	Consumer2(Resource2 r){
		this.r=r;
	}

	@Override
	public void run() {
		while(true){
			try {
				r.consume();
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	}
}

//===============结果==================

 

生产者0-生产者生产了:1
生产者2-生产者生产了:2
生产者3-生产者生产了:3
消费者6====消费者消费了:3
消费者7====消费者消费了:2
生产者1-生产者生产了:2
消费者4====消费者消费了:2
消费者5====消费者消费了:1
生产者0-生产者生产了:1
消费者6====消费者消费了:1
生产者3-生产者生产了:1
生产者2-生产者生产了:2
消费者7====消费者消费了:2
生产者1-生产者生产了:2
消费者5====消费者消费了:2
消费者4====消费者消费了:1
生产者0-生产者生产了:1
消费者6====消费者消费了:1
生产者3-生产者生产了:1
生产者2-生产者生产了:2

  

 

posted @ 2016-05-02 22:18  佳哇辉智  阅读(132)  评论(0编辑  收藏  举报