- import java.util.concurrent.locks.*;
- class ProducerConsumerDemo2
- {
- public static void main(String[] args)
- {
- Res r=new Res();//创建一个资源对象
- Producer pro=new Producer(r);//创建一个生产者
- Consumer con=new Consumer(r);//创建一个消费者
- Thread t1=new Thread(pro);
- Thread t2=new Thread(pro);//创建以上两个线程,即两个生产者线程t1,t2
- Thread t3=new Thread(con);
- Thread t4=new Thread(con);//创建以上两个线程,即两个消费者线程t3,t4
- t1.start();
- t2.start();
- t3.start();
- t4.start();//开启四个线程
- }
- }
- class Res
- {
- private String name;
- private int count=1;
- private boolean flag=false;
- private Lock lock=new ReentrantLock();//创建一个锁
- private Condition condition_pro=lock.newCondition();//该方法是创建一个生产者的Contion对象,目的是执行相应的线程,如只执行生产者的等待和唤醒。
- private Condition condition_con=lock.newCondition();//该方法是创建一个消费者的Contion对象,目的同上。
- /*这个方法是生产者生产商品的方法。*/
- public synchronized void set(String name)throws InterruptedException{
- lock.lock();//上锁
- try{
- while(flag)//若flag为true,表示已经有一个商品了,执行await语句抛出异常。若为false,表示还没有商品,生产者需要生产,则await()句不执行,执行下一句代码。
- condition_pro.await();//那么此时,因为可能还没有被消费者消费,所以为了让生产者不产生新的商品,故让所以生产者线程等待。抛出异常。执行finally语句解锁。
- this.name=name+"..."+(count++);
- System.out.println(Thread.currentThread().getName()+"生产者..."+this.name);//可以理解为生产商品的语句。
- flag=true;//以上语句的意思是生产者已经生产了一个产品,所以用flag=true告诉他们现在有一个商品了。
- condition_con.signal();//唤醒所有消费者线程。
- }
- finally{//加上finally是为了当是否抛出异常时,都能将锁释放,要不然其他线程进不来。
- lock.unlock();//解锁
- }
- }
- /*这个方法是消费者消费商品的方法。上锁解锁的方法如上*/
- public void out()throws InterruptedException{
- lock.lock();
- try{
- while(!flag)//当flag=false时,!flag=true,表示此时容器里没有商品,消费者不能消费。故用await让所有消费者线程等待。
- condition_con.await();
- System.out.println(Thread.currentThread().getName()+"消费者........."+this.name);//可以理解为消费商品的语句。
- flag=false;//商品消费完,容器里没有商品了,故把标记变为false.
- condition_pro.signalAll();//唤醒线程池里所有的生产者线程。
- }
- finally{
- lock.unlock();
- }
- }
- }
- class Producer implements Runnable//这个是生产者线程,创建商品。
- {
- private Res r;
- Producer(Res r){
- this.r=r;
- }
- public void run(){
- while(true){
- try{
- r.set("+商品+");
- }
- catch(InterruptedException e){}
- }
- }
- }
- class Consumer implements Runnable//这个是消费者者线程,消费商品。
- {
- private Res r;
- Consumer(Res r){
- this.r=r;
- }
- public void run(){
- while(true){
- try{
- r.out();
- }
- catch(InterruptedException e){}
- }
- }
- }
复制代码 代码可以直接运行的,不知道说的会不会太乱,你能不能理解额~ |