• Java多线程_生产者消费者模式2


    在我的上一条博客中,已经介绍到了多线程的经典案列——生产者消费者模式,但是在上篇中用的是传统的麻烦的非阻塞队列实现的。在这篇博客中我将介绍另一种方式就是:用阻塞队列完成生产者消费者模式,可以使用多种阻塞队列,这里最好使用LinkedBlockingQueue

    下面请看代码:

    import java.util.concurrent.LinkedBlockingQueue;
    
    public class BlockingQueueDemo {
        int size = 10;
        LinkedBlockingQueue<Integer> queue = new LinkedBlockingQueue<>(size);
    
        public static void main(String[] args) {
            BlockingQueueDemo bqd = new BlockingQueueDemo();
            Consumer c = bqd.new Consumer();
            Productor p = bqd.new Productor();
            c.setName("消费者");
            p.setName("生产者");
            c.start();
            p.start();
        }
    
        class Consumer extends Thread {
    
            @Override
            public void run() {
                consume();
            }
    
            private void consume() {
                while (true) {
                    try {
                        queue.take();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    System.out.println(Thread.currentThread().getName() + "消费了一个物品,还有" + queue.size() + "个物品");
                }
            }
        }
    
        class Productor extends Thread {
    
            @Override
            public void run() {
                product();
            }
    
            private void product() {
                while (true) {
                    try {
                        queue.put(1);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    System.out.println(Thread.currentThread().getName() + "生产了一个物品,现有" + queue.size() + "个物品");
                }
    
            }
    
        }
    }

    结果输出:

    总结一下:

    经过与传统的生产者消费者模式相比较(可以看我前面的博客“多线程_生产者消费者模式1”),使用阻塞队列代码要简单得多,不需要再单独考虑同步和线程间通信的问题。所以在实际开发中,一般符合生产者消费者模式的问题都推荐使用阻塞队列,这样实现可以尽量地避免程序出现意外的错误。

  • 相关阅读:
    ArcGIS JS 学习笔记1 用ArcGIS JS 实现仿百度地图的距离量测和面积量测
    WGS84,GCJ02, BD09坐标转换
    离线地图切片及使用解决方案
    ArcGIS API for JavaScript 加载独立GeoWebCache发布的Wmts服务
    如何利用已有的切片文件生成TPK
    arcgis api for silverlight(时间感知层)
    arcgis api for silverlight(行为和行动)
    开篇有益
    关于vue项目中表格所遇到的问题(三)
    关于vue项目中表格所遇到的问题(二)
  • 原文地址:https://www.cnblogs.com/ericz2j/p/10283645.html
Copyright © 2020-2023  润新知