• 生产者与消费者(三)---BlockingQueue


     前面阐述了实现生产者与消费者问题的两种方式:wait() / notify()方法 和 await() / signal()方法,本文继续阐述多线程的经典问题---生产者与消费者的第三种方式:BlockingQueue阻塞队列方法

    BlockingQueue阻塞队列方法

    BlockingQueue是JDK5.0的新增内容,它是一个已经在内部实现了同步的队列,实现方式采用的是我们第2种await() / signal()方法。它可以在生成对象时指定容量大小。它用于阻塞操作的是put()和take()方法。

    put()方法:类似于我们上面的生产者线程,容量达到最大时,自动阻塞。

    take()方法:类似于我们上面的消费者线程,容量为0时,自动阻塞。

    缓冲区(仓库):

    import java.util.concurrent.LinkedBlockingQueue;
    
    public class Storage {
        // 仓库最大存储量  
        private final int MAX_SIZE = 100;  
      
        // 仓库存储的载体  
        private LinkedBlockingQueue<Object> list = new LinkedBlockingQueue<Object>(100);  
      
        // 生产num个产品  
        public void produce(int num){  
            // 如果仓库剩余容量为MAX_SIZE  
            if (list.size() == MAX_SIZE){  
                System.out.println("【库存量】:" + MAX_SIZE + "暂时不能执行生产任务!");  
            }  
      
            // 生产条件满足情况下,生产num个产品  
            for (int i = 1; i <= num; ++i){  
                try{  
                    // 放入产品,自动阻塞  
                    list.put(new Object());  
                }  
                catch (InterruptedException e){  
                    e.printStackTrace();  
                }  
      
                System.out.println("【现仓储量为】:" + list.size());  
            }  
        }  
      
        // 消费num个产品  
        public void consume(int num){  
            // 如果仓库存储量不足  
            if (list.size() == 0){  
                System.out.println("【库存量】:0 暂时不能执行消费任务!");  
            }  
      
            // 消费条件满足情况下,消费num个产品  
            for (int i = 1; i <= num; ++i){  
                try{  
                    // 消费产品,自动阻塞  
                    list.take();  
                }  
                catch (InterruptedException e){  
                    e.printStackTrace();  
                }  
            }  
      
            System.out.println("【现仓储量为】:" + list.size());  
        }  
      
        // set/get方法  
        public LinkedBlockingQueue<Object> getList()  
        {  
            return list;  
        }  
      
        public void setList(LinkedBlockingQueue<Object> list)  
        {  
            this.list = list;  
        }  
      
        public int getMAX_SIZE()  
        {  
            return MAX_SIZE;  
        }  
    }

    生产者:

    public class Producer extends Thread {
         // 每次生产的产品数量  
        private int num;  
      
        // 所在放置的仓库  
        private Storage storage;  
      
        // 构造函数,设置仓库  
        public Producer(Storage storage){  
            this.storage = storage;  
        }  
      
        // 线程run函数  
        public void run(){  
            produce(num);  
        }  
      
        // 调用仓库Storage的生产函数  
        public void produce(int num){  
            storage.produce(num);  
        }  
      
        // get/set方法  
        public int getNum()  
        {  
            return num;  
        }  
      
        public void setNum(int num)  
        {  
            this.num = num;  
        }  
      
        public Storage getStorage()  
        {  
            return storage;  
        }  
      
        public void setStorage(Storage storage)  
        {  
            this.storage = storage;  
        }  
        
    }

    消费者:

    public class Consumer extends Thread {
        // 每次消费的产品数量  
        private int num;  
      
        // 所在放置的仓库  
        private Storage storage;  
      
        // 构造函数,设置仓库  
        public Consumer(Storage storage){  
            this.storage = storage;  
        }  
      
        // 线程run函数  
        public void run(){  
            consume(num);  
        }  
      
        // 调用仓库Storage的生产函数  
        public void consume(int num){  
            storage.consume(num);  
        }  
      
        // get/set方法  
        public int getNum()  
        {  
            return num;  
        }  
      
        public void setNum(int num)  
        {  
            this.num = num;  
        }  
      
        public Storage getStorage()  
        {  
            return storage;  
        }  
      
        public void setStorage(Storage storage)  
        {  
            this.storage = storage;  
        }  
    }

    测试类:

    public class Test {
        public static void main(String[] args) {
            // 仓库对象  
            Storage storage = new Storage();  
      
            // 生产者对象  
            Producer p1 = new Producer(storage);  
            Producer p2 = new Producer(storage);  
            Producer p3 = new Producer(storage);  
            Producer p4 = new Producer(storage);  
            Producer p5 = new Producer(storage);  
            Producer p6 = new Producer(storage);  
            Producer p7 = new Producer(storage);  
      
            // 消费者对象  
            Consumer c1 = new Consumer(storage);  
            Consumer c2 = new Consumer(storage);  
            Consumer c3 = new Consumer(storage);  
      
            // 设置生产者产品生产数量  
            p1.setNum(10);  
            p2.setNum(10);  
            p3.setNum(10);  
            p4.setNum(10);  
            p5.setNum(10);  
            p6.setNum(10);  
            p7.setNum(80);  
      
            // 设置消费者产品消费数量  
            c1.setNum(50);  
            c2.setNum(20);  
            c3.setNum(30);  
      
            // 线程开始执行  
            c1.start();  
            c2.start();  
            c3.start();  
            p1.start();  
            p2.start();  
            p3.start();  
            p4.start();  
            p5.start();  
            p6.start();  
            p7.start();  
        }
    }
  • 相关阅读:
    静态和伪静态
    数据库优化
    C#数组的排序(正序逆序)
    C# for和 foreach 的数组遍历 比较
    Python识别璇玑图中诗的数量
    Linux环境下配置matplotlib库使用中文绘图
    manjaro配置记录
    ubuntu环境下测试cache大小并校验
    ubuntu 单机配置hadoop
    cachestat 安装文档
  • 原文地址:https://www.cnblogs.com/Kevin-mao/p/5950774.html
Copyright © 2020-2023  润新知