zoukankan      html  css  js  c++  java
  • 同步函数 生产者和消费者模式 加强版(多人生产和多人消费)

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

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

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

    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

      

  • 相关阅读:
    自动化测试===【转】Robot Framework作者建议如何选择自动化测试框架
    python实战===一行代码就能搞定的事情!
    python实战===石头剪刀布,简单模型
    python基础===取txt文件的若干行到另一个文件
    python基础===文件对象的访问模式,以及计数循环的使用方法
    linux===linux在线模拟器汇总
    python基础===两个list合并成一个dict的方法
    python基础===map和zip的用法
    python基础===正则表达式(转)
    python基础===python内置函数大全
  • 原文地址:https://www.cnblogs.com/huiit/p/5453347.html
Copyright © 2011-2022 走看看