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)

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

  • 相关阅读:
    深入new/delete:Operator new的全局重载
    c语言运算符优先级
    投影仪开关机码和波特率
    sqlyog mysql 外键引用列找不到想要的字段的原因
    idea 迁移maven项目出现导入仓库半天没反应的问题解决
    idea 解决 pom.xml 中,maven仓库无法导入的问题(红线)
    fastjson 使用记录
    idea git pull项目到本地时容易出现的问题
    JSONObject
    idea Cannot Resolve Symbol 问题解决
  • 原文地址:https://www.cnblogs.com/lwmp/p/11513136.html
Copyright © 2011-2022 走看看