使用阻塞队列实现生产者-消费者模式——Java实现

来源:互联网 发布:淘宝手机详情页宽度 编辑:程序博客网 时间:2024/06/07 23:52

阻塞队列是一种基于数组实现的阻塞队列,它在构造时需要指定容量。当试图向满队列中添加元素或者从空队列中移除元素时,当前线程会被阻塞。通过阻塞队列,我们可以按以下模式来工作:工作者线程可以周期性的将中间结果放入阻塞队列中,其它线程可以取出中间结果并进行进一步操作。若工作者线程的执行比较慢(还没来得及向队列中插入元素),其他从队列中取元素的线程会等待它(试图从空队列中取元素从而阻塞);若工作者线程执行较快(试图向满队列中插入元素),则它会等待其它线程取出元素再继续执行。

—— 引自:点击打开链接

Java代码:

import java.util.concurrent.ArrayBlockingQueue;public class BlockingQeueTest {private int size = 20;// 使用阻塞队列,阻塞队列是一个基于数组实现的阻塞队列,它在构造时,需要指定容量。当试图向满队列中添加元素或者从空队列中移除元素时,// 当前线程会被阻塞。通过阻塞队列,我们可以按照以下模式来工作:生产者线程可以周期性地将一些数据放入阻塞队列中,消费者线程可以从阻塞队列中// 取出数据进行处理。若生产者线程执行的比较慢,消费者线程会等待它(试图从空队列中取元素而阻塞);// 若生产者线程执行的比较快(试图向满队列中插入元素),则它会等待其他线程取出元素再继续生产。private ArrayBlockingQueue<Integer> queue = new ArrayBlockingQueue<>(size);public static void main(String[] args) {BlockingQeueTest test = new BlockingQeueTest();Producer producer = test.new Producer();Consumer consumer = test.new Consumer();producer.start();consumer.start();}class Consumer extends Thread {@Overridepublic void run() {while (true) {try {// 从阻塞队列中取出一个元素queue.take();System.out.println("队列剩余" + queue.size() + "个元素!");} catch (Exception e) {}}}}class Producer extends Thread {@Overridepublic void run() {while (true) {try {// 向阻塞队列中插入一个元素queue.put(1);System.out.println("队列剩余空间:" + (size - queue.size()));} catch (Exception e) {}}}}}


0 0
原创粉丝点击