今天会是有offer的一天么-condition实现生产者消费者模式

今天我们使用condition简单实现一下生产者消费者模式。废话不多说直接上代码。

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

public class Main {
   private ReentrantLock lock=new ReentrantLock();
   private Condition NotEmpty=lock.newCondition();
   private Condition NotFull=lock.newCondition();
   private final int QueueSize=10;
   private PriorityQueue queue=new PriorityQueue(QueueSize);
   public static void main(String[] args) throws InterruptedException {
       Main test=new Main();
       Producer producer=test.new Producer();
       Consumer consumer=test.new Consumer();
       producer.start();
       consumer.start();
       Thread.sleep(10);
       //使用interrupt给线程设置一个中断的标志位,但是不会立刻中断。
       producer.interrupt();
       consumer.interrupt();
   }
   //消费者消费元素
   class Consumer extends Thread{
       private boolean flag=true;
       @Override
       public void run(){
           consumer();
       }
       public void consumer(){
    while(flag)
    {
        lock.lock();
        while(queue.size()==0)
        {
            System.out.println("队列中没有数据,消费者需要等待");
            try {
               //condition的await()方法类似于Object的wait方法
                NotEmpty.await();
            } catch (InterruptedException e) {
                flag=false;
            }
        }
        //从队列中拿出一个元素
        queue.poll();
        //condition的signal()方法类似于Object的notify()方法
        NotFull.signal();
        System.out.println("消费者从队列中拿出了一个元素,现在队列中还有"+queue.size()+"个元素");
        lock.unlock();
    }
   }
   }
   //生产者生成元素
   class Producer extends Thread{
       @Override
       public void  run(){
           producer();
       }
       private boolean flag=true;
       public void producer(){
           while(flag)
           {
               lock.lock();
               while(queue.size()==QueueSize){
                   System.out.println("队列已经满了,无法在添加元素");
                   try {
                       NotFull.await();
                   } catch (InterruptedException e) {
                       flag=false;
                   }
               }
               //从队列中消费一个元素
               queue.add(1);
               NotEmpty.signal();
               System.out.println("向队列中插入了一个元素,当前队列中有"+queue.size()+"个元素");
               lock.unlock();
           }

       }
   }


}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值