zoukankan      html  css  js  c++  java
  • 线程通信之生产者消费者阻塞队列版


    class MyResource {
    private volatile boolean FLAG = true; //默认开启,进行生产+消费
    private AtomicInteger atomicInteger = new AtomicInteger();

    BlockingQueue<String> blockingQueue = null;

    public MyResource(BlockingQueue<String> blockingQueue) {
    this.blockingQueue = blockingQueue;
    }

    public void myProduct() throws Exception {
    String data = null;
    boolean retValue;
    while (FLAG) {
    data = atomicInteger.incrementAndGet()+"";
    retValue = blockingQueue.offer(data,2L, TimeUnit.SECONDS);
    if(retValue) {
    System.out.println(Thread.currentThread().getName() +" 插入队列" + data +"成功");
    } else {
    System.out.println(Thread.currentThread().getName() +" 插入队列" + data +"失败");
    }
    TimeUnit.SECONDS.sleep(1);
    }
    System.out.println(Thread.currentThread().getName()+" 大老板叫停了,表示FLAG = false,生产动作结束");
    }

    public void myConsumer() throws Exception {
    String result = null;
    while(FLAG) {
    result = blockingQueue.poll(2L,TimeUnit.SECONDS);
    if(null == result || result.equalsIgnoreCase("")) {
    FLAG = false;
    System.out.println(Thread.currentThread().getName()+" 超过2秒钟没有取到蛋糕,消费退出");
    System.out.println();
    System.out.println();
    return ;
    }
    System.out.println(Thread.currentThread().getName()+" 消费队列"+result +"成功");

    }
    }

    public void stop() {
    this.FLAG = false;
    }
    }

    public class ProductConsumer_BlockQueueDemo {
    public static void main(String[] args){
    MyResource myResource = new MyResource(new ArrayBlockingQueue<String>(10));
    new Thread(() ->{
    System.out.println(Thread.currentThread().getName()+" 生产线程启动");
    try {
    myResource.myProduct();
    } catch (Exception e) {
    e.printStackTrace();
    }

    },"product").start();

    new Thread(() ->{
    System.out.println(Thread.currentThread().getName()+" 消费线程启动");
    try {
    myResource.myConsumer();
    } catch (Exception e) {
    e.printStackTrace();
    }

    },"consumer").start();
    //暂停一会儿线程
    try {TimeUnit.SECONDS.sleep(5);} catch (InterruptedException e) { e.printStackTrace(); }
    System.out.println();
    System.out.println();
    System.out.println();
    System.out.println("5秒时间到,大老板main线程叫停,活动结束");
    myResource.stop();
    }
    }

    运行结果见下图:

  • 相关阅读:
    LOJ#6031. 「雅礼集训 2017 Day1」字符串
    LG P4768 [NOI2018] 归程
    LG P3250 [HNOI2016]网络
    BZOJ4644 经典傻逼题
    LG P4373 [USACO18OPEN]Train Tracking P
    CF1375H Set Merging
    LG P6541 [WC2018]即时战略
    CF1097G Vladislav and a Great Legend
    python学习笔记-基本概念
    python学习笔记十-文件操作
  • 原文地址:https://www.cnblogs.com/liuyi13535496566/p/12154242.html
Copyright © 2011-2022 走看看