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)

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

  • 相关阅读:
    解决ArrayList线程不安全
    TraceView工具的使用
    Service
    Android之移动热修复
    06 swap命令,进程管理,rmp命令与yum命令,源码安装python
    04 linux用户群组和权限
    03 linux命令的操作
    Unity 5.x 导入教学Demo
    Creo二次开发—内存处理
    求一个数的二进制数中所含1的个数的代码实现
  • 原文地址:https://www.cnblogs.com/lwmp/p/11513136.html
Copyright © 2011-2022 走看看