zoukankan      html  css  js  c++  java
  • 生产者消费者问题--BlockingQueue

    # 代码:

    public class App {
    
        public static void main(String[] args) {
    
            BlockingQueue<Integer> queue = new ArrayBlockingQueue<>(6);
            Producer producer = new Producer(queue);
            Consumer consumer = new Consumer(queue);
    
            producer.produce(5);
            consumer.consume(4);
            producer.produce(3);
            consumer.consume(2);
        }
    }
    
    class Producer {
        private BlockingQueue<Integer> queue;
    
        public Producer(BlockingQueue<Integer> queue) {
            this.queue = queue;
        }
    
        public void produce(final int val) {
            new Thread() {
                public void run() {
                    try {
                        int surplus = val;
                        while (surplus > 0) {
                            queue.put(1024);
                            surplus--;
                            System.out.printf("%s plan to produce (%d), actually produce (%d), queue size (%d) 
    ",
                                    Thread.currentThread().getName(), val, 1, queue.size());
                        }
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }.start();
        }
    }
    
    class Consumer {
        private BlockingQueue<Integer> queue;
    
        public Consumer(BlockingQueue<Integer> queue) {
            this.queue = queue;
        }
    
        public void consume(final int val) {
            new Thread() {
                public void run() {
                    int surplus = val;
                    try {
                        while (surplus > 0) {
                            queue.take();
                            surplus--;
                            System.out.printf("%s plan to consume (%d), actually consume (%d), queue size (%d) 
    ",
                                    Thread.currentThread().getName(), val, 1, queue.size());
                        }
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
    
                }
            }.start();
        }
    }

    # 输出:

    Thread-0 plan to produce (5), actually produce (1), queue size (1)
    Thread-3 plan to consume (2), actually consume (1), queue size (0)
    Thread-2 plan to produce (3), actually produce (1), queue size (1)
    Thread-1 plan to consume (4), actually consume (1), queue size (0)
    Thread-2 plan to produce (3), actually produce (1), queue size (1)
    Thread-3 plan to consume (2), actually consume (1), queue size (0)
    Thread-0 plan to produce (5), actually produce (1), queue size (1)
    Thread-2 plan to produce (3), actually produce (1), queue size (1)
    Thread-1 plan to consume (4), actually consume (1), queue size (0)
    Thread-0 plan to produce (5), actually produce (1), queue size (2)
    Thread-1 plan to consume (4), actually consume (1), queue size (1)
    Thread-1 plan to consume (4), actually consume (1), queue size (1)
    Thread-0 plan to produce (5), actually produce (1), queue size (2)
    Thread-0 plan to produce (5), actually produce (1), queue size (2)

    # 有四个线程参与了这个过程,两个生产者,两个消费者

  • 相关阅读:
    【NOIP2000】【vijos1347】乘积最大
    【JSOI2014】【BZOJ5039】序列维护(线段树模板)
    【NOIP2013】【Luogu1966】火柴排队(逆序对)
    【基础】排序算法学习笔记
    【Luogu1908】逆序对(树状数组求逆序对)
    【POJ2299】Ultra-QuickSort(逆序对,归并排序)
    【POJ1723】SOLDIERS(中位数,货仓选址)
    【HAOI2008】【BZOJ1045】糖果传递(环形纸牌均分)
    【codevs1004】四子连棋
    Jzoj4900 平方数
  • 原文地址:https://www.cnblogs.com/lwmp/p/11513136.html
Copyright © 2011-2022 走看看