阻塞队列实现生产者-消费者模式

目录

  • 目录
    • 阻塞队列
    • 代码实现:
    • 博客参考

阻塞队列

  阻塞队列(BlockingQueue)相较于普通的队列,添加了2个附加的操作。
(1)在队列为空时,获取元素的线程会等待队列变为非空。
(2)当队列满时,存储元素的线程会等待队列可用。
  阻塞队列常用于生产者和消费者的场景,生产者是往队列里添加元素的线程,消费者是从队列里拿元素的线程。
  如果是非阻塞队列在实现生产者和消费者模型时,我们需要手动的添加同步策略以及线程之间的唤醒策略。所以,阻塞队列可以很好解决这一问题。


代码实现:

public class Test {
    private int queueSize = 10;
    private ArrayBlockingQueue queue = new ArrayBlockingQueue(queueSize);

    public static void main(String[] args)  {
        Test test = new Test();
        Producer producer = test.new Producer();
        Consumer consumer = test.new Consumer();

        producer.start();
        consumer.start();
    }

    class Consumer extends Thread{

        @Override
        public void run() {
            consume();
        }

        private void consume() {
            while(true){
                try {
                    queue.take();
                    System.out.println("从队列取走一个元素,队列剩余"+queue.size()+"个元素");
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    class Producer extends Thread{

        @Override
        public void run() {
            produce();
        }

        private void produce() {
            while(true){
                try {
                    queue.put(1);
                    System.out.println("向队列取中插入一个元素,队列剩余空间:"+(queueSize-queue.size()));
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

博客参考

http://ifeve.com/java-blocking-queue/
http://www.cnblogs.com/dolphin0520/p/3932906.html

你可能感兴趣的:(Java并发编程的艺术)