zoukankan      html  css  js  c++  java
  • 生产消费者

    生产消费者

    AQS
    是个抽象类。里面定义了同步器的基本框架,实现了基本的结构功能。只留有状态条件的维护由具体同步器根据具体场景来定制,如常见的 ReentrantLock 、 RetrantReadWriteLock和CountDownLatch

    Condition是在java 1.5中才出现的,它用来替代传统的Object的wait()、notify()实现线程间的协作,相比使用Object的wait()、notify(),使用Condition的await()、signal()这种方式实现线程间协作更加安全和高效。因此通常来说比较推荐使用Condition,阻塞队列实际上是使用了Condition来模拟线程间协作。

        public static void main(String[] args) throws IOException {
    
            AtomicInteger goi = new AtomicInteger();
            ExecutorService executorService = Executors.newCachedThreadPool();
            ReentrantLock reentrantLock = new ReentrantLock();
            Condition conP = reentrantLock.newCondition();
            Condition conC = reentrantLock.newCondition();
            ArrayBlockingQueue<Integer> goods = new ArrayBlockingQueue(10);
    
            executorService.submit(() -> {
                while (true) {
                    reentrantLock.lock();
                    if (goods.size() == 10) {
                        try {
                            System.out.println("仓库已满,等待被消费");
                            conP.await();
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
    
                    int i = goi.getAndIncrement();
                    goods.add(i);
    
                    System.out.println("仓库 补货 ..." + i);
                    conC.signalAll(); //消费者可以消费了
                    reentrantLock.unlock();
                }
            });
    
            executorService.submit(() -> {
    
                while (true) {
                    reentrantLock.lock();
                    if (goods.size() == 0) {
                        try {
                            conC.await(); //没有货物,消费者停止
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                    int n = goods.poll(); //消费开始,库存不满,
    
                    System.out.println("消费者消费 " + n);
                    conP.signalAll(); //生产者可以开始生产了
                    reentrantLock.unlock();
                }
            });
    
            System.in.read();
        }
  • 相关阅读:
    servlet的监听器、过滤器、拦截器的区别
    根据一个单词找所有的兄弟单词的思想如何处理
    Maven deploy 部署 jar 到 Nexus 私服
    在vps上搭建hexo博客
    Java解决LeetCode72题 Edit Distance
    学以致用:Python爬取廖大Python教程制作pdf
    puppeteer截图
    Netty接收HTTP文件上传及文件下载
    Docker中执行Shell出现乱码
    Netty URL路由方案探讨
  • 原文地址:https://www.cnblogs.com/snow-man/p/14529038.html
Copyright © 2011-2022 走看看