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)

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

  • 相关阅读:
    jquery中选择块并改变属性值的方法
    Bash Shell中Shift用法分享
    linux批量备份服务器配置文件和目录的脚本
    [Java开发之路](8)输入流和输出流
    cf 251 B Playing with Permutations 暴力 分类讨论
    CSS改变字体下划线颜色
    DICOM:C-GET服务
    Android平台录音音量计的实现
    【BZOJ】2186 沙拉公主的困惑
    【php】global的使用与php的全局变量
  • 原文地址:https://www.cnblogs.com/lwmp/p/11513136.html
Copyright © 2011-2022 走看看