• 阻塞队列实现生产者-消费者


    package com.demo.blockingqueue;
    
    import java.util.List;
    import java.util.concurrent.ArrayBlockingQueue;
    import java.util.concurrent.BlockingQueue;
    import java.util.concurrent.TimeUnit;
    import java.util.concurrent.atomic.AtomicInteger;
    
    class MyData //资源类
    {
        private volatile boolean FLAG=true;
        private AtomicInteger atomicInteger=new AtomicInteger();
    
        BlockingQueue<String> blockingQueue=null;
    
        public MyData(BlockingQueue<String> blockingQueue) {
            this.blockingQueue = blockingQueue;
            System.out.println(Thread.currentThread().getName());
        }
    
    
    
        public void product() throws Exception{
            String data = null;
            Boolean resultValue;
            while (FLAG){
                data=atomicInteger.incrementAndGet()+"";
                resultValue = blockingQueue.offer(data + "", 2L, TimeUnit.SECONDS);
                if(resultValue){
                    System.out.println(Thread.currentThread().getName()+"----插入队列"+data+"成功");
                }else {
                    System.out.println(Thread.currentThread().getName()+"插入队列"+data+"失败");
                }
                TimeUnit.MILLISECONDS.sleep(100);
            }
    
            System.out.println(Thread.currentThread().getName()+"大老板叫停了,表示FLAG=false 生产动作结束");
    
        }
    
        public void consumer() throws Exception{
            String result = null;
            while (FLAG){
                result=blockingQueue.poll(2L,TimeUnit.SECONDS);
                if(result==null||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 ProducterAndConsumer {
    
        public static void main(String[] args) {
            MyData myData=new MyData(new ArrayBlockingQueue<String>(10));
    
            new Thread(()->{
                System.out.println(Thread.currentThread().getName()+"生产线程启动");
                try {
                    myData.product();
                } catch (Exception e) {
                    e.printStackTrace();
                }
    
            },"product").start();
    
    
            new Thread(()->{
                System.out.println(Thread.currentThread().getName()+"消费者线程启动");
    
                try {
                    myData.consumer();
                } 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("5秒钟到,大老板main线程 叫停");
            myData.stop();
        }
    }
  • 相关阅读:
    react 添加addEventListener事件
    C#中 Queue List LinkedList 性能对比
    Nginx中proxy_pass的斜杠(/)问题
    原码,补码和反码
    Base64原理
    springsessiondataredis session同步的使用
    中间件redis常用命令
    java项目中的classpath的理解
    linux环境oracle设置环境变量
    Redis 主从复制的原理及演进
  • 原文地址:https://www.cnblogs.com/jiawen010/p/12386715.html
Copyright © 2020-2023  润新知