生产者-消费者模式

Posted demrystv

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了生产者-消费者模式相关的知识,希望对你有一定的参考价值。

生产者-消费者模式

  

1. 阻塞队列  

  生产者消费者模式中,一般采用阻塞队列来实现。阻塞队列(BlockingQueue)是一个支持两个附加操作的队列。这两个附加的操作是:在队列为空时,获取元素的线程会等待队列变为非空。当队列满时,存储元素的线程会等待队列可用。

 

2. 阻塞队列的运用

  当队列中没有数据的情况下,消费者端的所有线程都会被自动阻塞(挂起),直到有数据放入队列。

  当队列中填满数据的情况下,生产者端的所有线程都会被自动阻塞(挂起),直到队列中有空的位置,线程被自动唤醒。

  阻塞队列中提供了四种处理方法

  技术分享图片

  JDK7提供了7个阻塞队列。分别是

  1)ArrayBlockingQueue :一个由数组结构组成的有界阻塞队列。

  2)LinkedBlockingQueue :一个由链表结构组成的有界阻塞队列。

  3)PriorityBlockingQueue :一个支持优先级排序的无界阻塞队列。

  4)DelayQueue:一个使用优先级队列实现的无界阻塞队列。

  5)SynchronousQueue:一个不存储元素的阻塞队列。

  6)LinkedTransferQueue:一个由链表结构组成的无界阻塞队列。

  7)LinkedBlockingDeque:一个由链表结构组成的双向阻塞队列。

 

3. 生产者-消费者的代码实现

生产者:

package com.commonCode.producerConsumer;

import java.util.concurrent.BlockingQueue;

/**
 * Created by Demrystv.
 */
public class Producer implements Runnable {

    BlockingQueue<String> queue;

    public Producer(BlockingQueue<String> queue) {
        this.queue = queue;
    }

    @Override
    public void run() {
        try {
            String temp = "A Product, 生产线程:" + Thread.currentThread().getName();
            System.out.println("I have made a product:" + Thread.currentThread().getName());
            queue.put(temp);//如果对垒是满的话,会阻塞当前线程
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

消费者:

package com.commonCode.producerConsumer;

import java.util.concurrent.BlockingQueue;

/**
 * Created by Demrystv.
 */
public class Consumer implements Runnable {

    BlockingQueue<String> queue;

    public Consumer(BlockingQueue<String> queue) {
        this.queue = queue;
    }

    @Override
    public void run() {
        try {
            String temp = queue.take();//如果队列为空,就会阻塞线程
            System.out.println(temp);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

    }
}

测试类:

package com.commonCode.producerConsumer;

import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingDeque;

/**
 * Created by Demrystv.
 */
public class test {

    public static void main(String[] args) {
        BlockingQueue<String> queue = new LinkedBlockingDeque<String>(2);
        //不设置的话,默认值为Integer.MAX_VALUE

        Producer producer = new Producer(queue);
        Consumer consumer = new Consumer(queue);
        for (int i = 0; i < 5; i++) {
            new Thread(producer, "Producer" + (i + 1)).start();
            new Thread(consumer, "Consumer" + (i + 1)).start();
        }
    }
}

执行结果:

技术分享图片

 

以上是关于生产者-消费者模式的主要内容,如果未能解决你的问题,请参考以下文章

生产者和消费者模式-代码

并行模式之生产者-消费者模式

生产消费者模式,并不是高并发模式

生产者消费者模型-Java代码实现

Java多线程:生产者消费者模型

Java并发多线程编程——生产者消费者模式示例(传统版本)