• Java线程--BlockingQueue使用


    原创:转载需注明原创地址 https://www.cnblogs.com/fanerwei222/p/11871704.html

    Java线程--BlockingQueue使用

    阻塞队列就是内容满了之后, 就开始阻塞, 直到有消费者消费了东西之后才又开始生产, 看代码:

    package concurrent.blockingqueue;
    
    import java.util.concurrent.BlockingQueue;
    import java.util.concurrent.atomic.AtomicInteger;
    
    /**
     * 生产者
     */
    public class Producer implements Runnable {
    
        /**
         * 计数器
         */
        private static AtomicInteger k = new AtomicInteger(0);
        BlockingQueue queue;
    
        public Producer(BlockingQueue queue) {
            this.queue = queue;
        }
    
        @Override
        public void run() {
            while (true) {
                try {
                    /**
                     * 把生产出来的东西丢进队列中去
                     */
                    queue.put(produce());
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    
        /**
         * 生产东西, 然后返回出去
         * @return
         * @throws InterruptedException
         */
        private AtomicInteger produce() throws InterruptedException {
            k.addAndGet(1);
            System.out.println("生产者开始生产东西了... " + k);
            return k;
        }
    }
    package concurrent.blockingqueue;
    
    import java.util.concurrent.BlockingQueue;
    
    /**
     * 消费者
     */
    public class Consumer implements Runnable {
    
        BlockingQueue queue;
    
        public Consumer(BlockingQueue queue){
            this.queue = queue;
        }
    
        @Override
        public void run() {
            while (true) {
                try {
                    /**
                     * 延迟3秒再从队列中取出,
                     * 这样就可以看到生产队列生产满了之后就停止生产,
                     * 直到消费者消费了之后再继续生产
                     */
                    Thread.sleep(3000);
                    consume(queue.take());
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    
        /**
         * 消费东西
         * @param o
         */
        void consume(Object o){
            System.out.println("消费者开始消费东西了....  " + o);
        }
    }
    package concurrent.blockingqueue;
    
    import java.util.concurrent.ArrayBlockingQueue;
    import java.util.concurrent.BlockingQueue;
    
    /**
     * main 测试类
     */
    public class MainTest {
        public static void main(String[] args) {
            /**
             * 搞一个阻塞队列容量为3, 当超过容量就开始堵塞
             */
            BlockingQueue queue = new ArrayBlockingQueue(3);
            new Thread(new Producer(queue)).start();
            new Thread(new Consumer(queue)).start();
        }
    }

    看打印结果:

    生产者开始生产东西了... 1
    生产者开始生产东西了... 2
    生产者开始生产东西了... 3
    生产者开始生产东西了... 4
    消费者开始消费东西了....  4
    生产者开始生产东西了... 5
    消费者开始消费东西了....  5
    生产者开始生产东西了... 6
    消费者开始消费东西了....  6
    生产者开始生产东西了... 7
    消费者开始消费东西了....  7
    生产者开始生产东西了... 8
    消费者开始消费东西了....  8
    生产者开始生产东西了... 9
    消费者开始消费东西了....  9
    生产者开始生产东西了... 10

    这个结果很明显了.

  • 相关阅读:
    常见网络攻击手段原理分析
    admins.py总结比较,转
    django的表与表之间的关系详细讲解
    django中的@login_required
    安装指定版本的第三方库
    在django中使用logging
    django的manytomany总结
    manyToManyField理解和用法
    django的多对一,一对一,多对多关系
    python 的os的总结
  • 原文地址:https://www.cnblogs.com/fanerwei222/p/11871704.html
Copyright © 2020-2023  润新知