生产者消费模式

阻塞队列版

  package com.jian8.juc.queue;
  
  import java.util.concurrent.ArrayBlockingQueue;
  import java.util.concurrent.BlockingQueue;
  import java.util.concurrent.TimeUnit;
  import java.util.concurrent.atomic.AtomicInteger;
  
  public class ProdConsumer_BlockQueueDemo {
      public static void main(String[] args) {
          MyResource myResource = new MyResource(new ArrayBlockingQueue<>(10));
          new Thread(() -> {
              System.out.println(Thread.currentThread().getName() + "\t生产线程启动");
              try {
                  myResource.myProd();
              } catch (Exception e) {
                  e.printStackTrace();
              }
          }, "Prod").start();
          new Thread(() -> {
              System.out.println(Thread.currentThread().getName() + "\t消费线程启动");
              try {
                  myResource.myConsumer();
              } catch (Exception e) {
                  e.printStackTrace();
              }
          }, "Consumer").start();
  
          try { TimeUnit.SECONDS.sleep(5); } catch (InterruptedException e) { e.printStackTrace(); }
          System.out.println("5s后main叫停,线程结束");
          try {
              myResource.stop();
          } catch (Exception e) {
              e.printStackTrace();
          }
      }
  }
  
  class MyResource {
      private volatile boolean flag = true;//默认开启,进行生产+消费
      private AtomicInteger atomicInteger = new AtomicInteger();
  
      BlockingQueue<String> blockingQueue = null;
  
      public MyResource(BlockingQueue<String> blockingQueue) {
          this.blockingQueue = blockingQueue;
          System.out.println(blockingQueue.getClass().getName());
      }
  
      public void myProd() throws Exception {
          String data = null;
          boolean retValue;
          while (flag) {
              data = atomicInteger.incrementAndGet() + "";
              retValue = blockingQueue.offer(data, 2, TimeUnit.SECONDS);
              if (retValue) {
                  System.out.println(Thread.currentThread().getName() + "\t插入队列" + data + "成功");
              } else {
                  System.out.println(Thread.currentThread().getName() + "\t插入队列" + data + "失败");
              }
              TimeUnit.SECONDS.sleep(1);
          }
          System.out.println(Thread.currentThread().getName() + "\t大老板叫停了,flag=false,生产结束");
      }
  
      public void myConsumer() throws Exception {
          String result = null;
          while (flag) {
              result = blockingQueue.poll(2, TimeUnit.SECONDS);
              if (null == result || result.equalsIgnoreCase("")) {
                  flag = false;
                  System.out.println(Thread.currentThread().getName() + "\t超过2s没有取到蛋糕,消费退出");
                  System.out.println();
                  return;
              }
              System.out.println(Thread.currentThread().getName() + "\t消费队列" + result + "成功");
          }
      }
  
      public void stop() throws Exception {
          flag = false;
      }
  }
  ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值