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