生产者消费者解读

1、jdk1.5前实现一个简单的生产者消费者模型

一把锁  多个生产者多个消费者  -- 实现生产一个消费一个

class Product3
{
   private String name;
   private int count;
   private boolean flag;

   //生产产品的功能
   public synchronized void produce(String name)
    {
        while(flag)
        {          
            try{wait();}catch(InterruptedException e){e.printStackTrace();}
        }
        this.name = name+"..."+count;
        System.out.println(Thread.currentThread().getName()+"生产了....."+this.name);
        count++;
        flag = true;
        notifyAll();
    }
  //消费产品的功能
  public synchronized void consume()
    {
        while(!flag)
        {
            try{wait();}catch(InterruptedException e){e.printStackTrace();}
        }
        System.out.println(Thread.currentThread().getName()+"......消费了....."+name);
        flag = false;
        notifyAll();
    }
}


//生产任务
class Producer3 implements Runnable
{
    private Product3 pro;
    public Producer3(Product3 pro)
    {
        this.pro =pro;
    }
    public void run()
    {
        while(true)
        {
            pro.produce("笔记本");
        }
    }
}
//消费任务
class Consumer3 implements Runnable
{ 
    private Product3 pro;
    public Consumer3(Product3 pro)
    {
        this.pro =pro;
    }
    public void run()
    {
        while(true)
        {
            pro.consume();
        }
    }
}
class Demo1
{
    public static void main(String[] args) 
    {
        Product3 pro = new Product3();

        Producer3 Producer3 =new Producer3(pro);
        Consumer3 Consumer3 = new Consumer3(pro);

        Thread t0 = new Thread(Producer3);
        Thread t1 = new Thread(Producer3);

        Thread t2 =  new Thread(Consumer3);
        Thread t3 =  new Thread(Consumer3);

        t0.start();
        t1.start();

        t2.start();
        t3.start();


    }
}
2、jdk1.5后实现一个简单的生产者消费者模型
一把锁  多个生产者多个消费者  -- 实现生产一个消费一个

import java.util.concurrent.locks.*;
class Product0
{
   private String name;
   private int count;
   private boolean flag;

   //创建一把锁
   private Lock lock = new ReentrantLock();

   //得到和锁绑定的Condition对象
   private Condition con = lock.newCondition();

   //生产产品的功能
   public  void produce(String name)
	{
	    lock.lock();//获取锁
	   try{
			while(flag)
			{     
				try{con.await();}catch(InterruptedException e){e.printStackTrace();}
			}
			this.name = name+"..."+count;
			System.out.println(Thread.currentThread().getName()+"生产了....."+this.name);
			count++;
			flag = true;
			con.signalAll();
	    }
		finally
		{
			lock.unlock();//释放锁
		}
    }
  //消费产品的功能
  public void consume()
	{
	    lock.lock();
		try{
			while(!flag)
			{
				try{con.await();}catch(InterruptedException e){e.printStackTrace();}
			}
			System.out.println(Thread.currentThread().getName()+"......消费了....."+name);
			flag = false;
			con.signalAll();
		}
		finally
		{
			lock.unlock();
		}
    }
}

//生产任务
class Producer0 implements Runnable
{
    private Product0 pro;
	public Producer0(Product0 pro)
	{
		this.pro =pro;
	}
	public void run()
	{
		while(true)
		{
			pro.produce("笔记本");
		}
	}
}
//消费任务
class Consumer0 implements Runnable
{ 
    private Product0 pro;
	public Consumer0(Product0 pro)
	{
		this.pro =pro;
	}
	public void run()
	{
		while(true)
		{
			pro.consume();
		}
	}
}
class Demo2
{
	public static void main(String[] args) 
	{
		Product0 pro = new Product0();

		Producer0 Producer0 =new Producer0(pro);
		Consumer0 Consumer0 = new Consumer0(pro);

		Thread t0 = new Thread(Producer0);
		Thread t1 = new Thread(Producer0);

		Thread t2 =  new Thread(Consumer0);
		Thread t3 =  new Thread(Consumer0);

		t0.start();
		t1.start();

		t2.start();
		t3.start();
	}
}
3、用两把锁对代码进行优化

一把锁  多个生产者多个消费者  -- 实现生产一个消费一个

import java.util.concurrent.locks.*;
class Product
{
   private String name;
   private int count;
   private boolean flag;

   //创建一把锁
   private Lock lock = new ReentrantLock();

   //得到和锁绑定的Condition对象,控制生产线程的唤醒和等待
   private Condition pro = lock.newCondition();

   //得到和锁绑定的Condition对象,控制消费线程的唤醒和等待
   private Condition con = lock.newCondition();

   //生产产品的功能  为false生产   为true消费 
   public  void produce(String name)
	{
	    lock.lock();//获取锁
	   try{
			while(flag)
			{     
				try{pro.await();}catch(InterruptedException e){e.printStackTrace();}
			}
			this.name = name+"..."+count;  //this用到比较棒
			System.out.println(Thread.currentThread().getName()+"生产了....."+this.name);
			count++;
			flag = true;
			con.signal();
	    }
		finally
		{
			lock.unlock();//释放锁
		}
    }
  //消费产品的功能
  public void consume()
	{
	    lock.lock();
		try{
			while(!flag)
			{
				try{con.await();}catch(InterruptedException e){e.printStackTrace();}
			}
			System.out.println(Thread.currentThread().getName()+"......消费了....."+name);
			flag = false;
			pro.signal();
		}
		finally
		{
			lock.unlock();
		}
    }
}


//生产任务
class Producer implements Runnable
{
    private Product pro;
	public Producer(Product pro)
	{
		this.pro =pro;
	}
	public void run()
	{
		while(true)
		{
			pro.produce("笔记本");
		}
	}
}
//消费任务
class Consumer implements Runnable
{ 
    private Product pro;
	public Consumer(Product pro)
	{
		this.pro =pro;
	}
	public void run()
	{
		while(true)
		{
			pro.consume();
		}
	}
}
class Demo3
{
	public static void main(String[] args) 
	{
		Product pro = new Product();

		Producer producer =new Producer(pro);
		Consumer consumer = new Consumer(pro);

		Thread t0 = new Thread(producer);
		Thread t1 = new Thread(producer);

		Thread t2 =  new Thread(consumer);
		Thread t3 =  new Thread(consumer);

		t0.start();
		t1.start();

		t2.start();
		t3.start();
	}
}

结果示例:

Thread-0生产了.....笔记本...105756
Thread-3......消费了.....笔记本...105756
Thread-1生产了.....笔记本...105757
Thread-2......消费了.....笔记本...105757
Thread-0生产了.....笔记本...105758
Thread-3......消费了.....笔记本...105758
Thread-1生产了.....笔记本...105759
Thread-2......消费了.....笔记本...105759
Thread-0生产了.....笔记本...105760
Thread-3......消费了.....笔记本...105760


4、最多生产N个产品,
class Product2
{
	//产品名称
    private String name;
	//产品价格
	private double price;
	//存放产品的容器
	private Product2[] arr = new Product2[100];
	//创建一把锁
	private Lock lock =new ReentrantLock();
	//创建和锁绑定的Condition对象,控制生产线程
	private Condition pro = lock.newCondition();
	//创建和锁绑定的Condition对象,控制消费线程
	private Condition con = lock.newCondition();
	//生产使用的下标
	private int propointer;
	//消费使用的下标
	private int conpointer;
	//记录产品数量
	private int count;

	public Product2(){}
	public Product2(String name,double price)
	{
		this.name = name;
		this.price = price;
	}
	//生产功能
	public void produce()
	{
		lock.lock();
		try
		{
			//先判断该不该生产,当容器满的时候不能生产
			while(count==arr.length)
			{
				try{pro.await();}catch(InterruptedException e){e.printStackTrace();}
			}
			arr[propointer]=new Product2("衬衣",99.99);
            System.out.println(Thread.currentThread().getName()+"...生产了"+arr[propointer]+"..."+count);
			count++;//数量加1
			if(++propointer==arr.length)
				propointer=0;
			con.signal();
		}
		finally
		{
			lock.unlock();
		}
	}
	//消费功能
	public void consume()
	{
		lock.lock();
		try
		{
			//先判断该不该消费,当商品数量为0 的时候,不能消费
			while(count==0)
			{
				try{con.await();}catch(InterruptedException e){e.printStackTrace();}
			}
			Product2 yifu = arr[conpointer];
			System.out.println(Thread.currentThread().getName()+"...消费了"+yifu);
            count--;
            if(++conpointer==arr.length)
				conpointer=0;
            pro.signal();
		}
		finally
		{
			lock.unlock();
		}
	}

	public String toString()  //打印的是对象,要重写toString方法
	{
		return name+","+price;
	}

}
class Producer2 implements Runnable
{
	private Product2 clo;
	public Producer2(Product2 clo)
	{
		this.clo = clo;
	}
	public void run()
	{
	    while(true)
		{
			clo.produce();
		}
	}
}
class Consumer2 implements Runnable
{
	private Product2 clo;
	public Consumer2(Product2 clo)
	{
		this.clo = clo;
	}
	public void run()
	{
		while(true)
		{
			clo.consume();
		}
	}
}
class Demo4
{
	public static void main(String[] args) 
	{
		Product2 clo = new Product2();

		Producer2 Producer2 = new Producer2(clo);

		Consumer2 Consumer2 = new Consumer2(clo);

		Thread t1 = new Thread(Producer2,"生产者1");
		Thread t2 = new Thread(Producer2,"生产者2");

		Thread t3 = new Thread(Consumer2,"消费1");
		Thread t4 = new Thread(Consumer2,"消费2");

		t1.start();
		t2.start();
		t3.start();
		t4.start();
	}
}
结果示例:
生产者1...生产了衬衣,99.99...93
生产者1...生产了衬衣,99.99...94
生产者1...生产了衬衣,99.99...95
生产者1...生产了衬衣,99.99...96
生产者1...生产了衬衣,99.99...97
生产者1...生产了衬衣,99.99...98
生产者1...生产了衬衣,99.99...99
消费1...消费了衬衣,99.99
消费1...消费了衬衣,99.99
消费1...消费了衬衣,99.99
消费1...消费了衬衣,99.99

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值