阻塞队列之LinkedBlockingQueue

LinkedBlockingQueue是一种基于链表结构的有界阻塞队列,默认大小为Integer.MAX_VALUE。它遵循FIFO原则,不允许插入null元素。与ArrayBlockingQueue相比, LinkedBlockingQueue的存储结构不同,采用单向链表而非对象数组,且其构造方式更灵活,不支持公平锁。两者在操作方法上保持一致,如put和take等。

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

LinkedBlockingQueue特点:

1、数据结构:单向链表;

2、有界队列,默认长度为:Integer.MAX_VALUE;

3、和ArrayBlockingQueue一样,不允许放入空值;

4、元素按FIFO排序;

对比ArrayBlockingQueue:

1、存储结构不同,ArrayBlockingQueue 采用对象数组存储数据;LinkedBlockingQueue采用单向链表存储数据;

2、构造不同,ArrayBlockingQueue必须指定长度,且可以指定是否使用公平锁定及初始集合;而LinkedBlockingQueue可以不指定长度,默认值是Integer.MAX_VALUE,另外LinkedBlockingQueue不支持参数化设置公平锁或非公平锁,默认是非公平锁:NonfairSync;

3、操作方法相同,ArrayBlockingQueue放入元素:add(抛异常)、offer(返回true、false)、put(阻塞等待),取出元素:poll、take;而LinkedBlockingQueue也都一样;

生产者消费者模式中都可以使用阻塞队列,关键是要用put阻塞方法和take阻塞方法;

import java.util.Scanner;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.TimeUnit;

/**
 * 基本和ArrayBlockingQueue一样 区别有: 
 * ArrayBlockingQueue--数组结构、必须指定长度、可以定制使用工作锁或非公平锁;
 * LinkedBlockingQueue--单向链表结构、可以不指定长度,默认是Integer.MAX_VALUE,不能指定使用何种锁;
 */
public class LinkedBlockingQueueTest {

	private ExecutorService threadPool = Executors.newFixedThreadPool(2);

	private LinkedBlockingQueue<String> linkedBlockingQueue = new LinkedBlockingQueue<String>();

	public LinkedBlockingQueueTest() {
	}

	private void test() {
		// put
		threadPool.submit(new Runnable() {
			public void run() {
				System.out.println("Please input:");
				Scanner sc = new Scanner(System.in);
				String readLine = null;
				while (true) {
					readLine = sc.nextLine();
					try {
						if ("quit".equalsIgnoreCase(readLine)) {
							linkedBlockingQueue.put("quit");
							break;
						} else {
							linkedBlockingQueue.put(readLine);
						}
					} catch (Exception e) {
						e.printStackTrace();
					}
				}
				sc.close();
			}
		});

		// take
		threadPool.submit(new Runnable() {
			public void run() {
				try {
					String takeLine = null;
					while (true) {
						takeLine = linkedBlockingQueue.take();
						if ("quit".equalsIgnoreCase(takeLine)) {
							break;
						} else {
							System.out.println("take:" + takeLine);
						}
						TimeUnit.MILLISECONDS.sleep(2000);
					}
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
		});
	}

	public static void main(String[] args) {
		LinkedBlockingQueueTest linkedBlockingQueueTest = new LinkedBlockingQueueTest();
		linkedBlockingQueueTest.test();
	}
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值