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

本文介绍阻塞队列的基本概念与工作模式,并通过Java代码示例展示如何利用阻塞队列实现生产者消费者模式,有效管理多线程间的同步问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

—— 引自:点击打开链接

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 {
		@Override
		public void run() {
			while (true) {
				try {
					// 从阻塞队列中取出一个元素
					queue.take();
					System.out.println("队列剩余" + queue.size() + "个元素!");
				} catch (Exception e) {

				}
			}
		}
	}

	class Producer extends Thread {
		@Override
		public void run() {
			while (true) {
				try {
					// 向阻塞队列中插入一个元素
					queue.put(1);
					System.out.println("队列剩余空间:" + (size - queue.size()));
				} catch (Exception e) {
				}
			}
		}
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值