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();
        }
  • 相关阅读:
    Bind和Eval的区别详解(ZT)
    .net中IndexOf和LastIndexOf的区别 
    个人学习代码保存:例3. GridView相关练习操作
    Convert.ToInt32和int.Parse有什么区别?
    个人学习代码保存:例1.asp.net DataList相关操作
    Sum(构造,枚举)
    1278 相离的圆(51nod)
    Wheels(bfs遍历,CERC 2014)
    详解 Android 的 Activity 组件
    Android应用程序变量
  • 原文地址:https://www.cnblogs.com/snow-man/p/14529038.html
Copyright © 2011-2022 走看看