编程语言
首页 > 编程语言> > 【并发编程】阻塞队列BlockingQueue入门

【并发编程】阻塞队列BlockingQueue入门

作者:互联网

BlockingQueue是什么

阻塞队列继承了队列Queue接口

Queue接口方法.png

BlockingQueue常用方法

方法 抛出异常 返回特定值 阻塞 阻塞特定时间
入队 add(e) offer(e) put(e) offer(e, time, unit)
出队 remove() poll() take() poll(time, unit)
获取队首元素 element() peek() 不支持 不支持

阻塞队列的特性

阻塞队列的take方法

阻塞队列的take方法.png

阻塞队列的put方法

阻塞队列的put方法.png

阻塞队列的边界

阻塞队列的应用场景

常见阻塞队列

阻塞队列的验证方法

import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;

public class BlockingQueueTest {
	public static void main(String[] args) {
		addTest();
		// removeTest();
		// elementTest()
		// offerTest()
		// pollTest()
		// peekTest()
		// putTest()
		// putTest()
	}

	/**
	 * add 方法是往队列里添加一个元素,如果队列满了,就会抛出异常来提示队列已满。
	 */
	private static void addTest() {
		BlockingQueue<Integer> blockingQueue = new ArrayBlockingQueue<Integer>(2);
		System.out.println(blockingQueue.add(1));
		System.out.println(blockingQueue.add(2));
		System.out.println(blockingQueue.add(3));
	}

	/**
	 * remove 方法的作用是删除元素并返回队列的头节点,如果删除的队列是空的, remove 方法就会抛出异常。
	 */
	private static void removeTest() {
		ArrayBlockingQueue<Integer> blockingQueue = new ArrayBlockingQueue<Integer>(2);
		blockingQueue.add(1);
		blockingQueue.add(2);
		System.out.println(blockingQueue.remove());
		System.out.println(blockingQueue.remove());
		System.out.println(blockingQueue.remove());
	}

	/**
	 * element 方法是返回队列的头部节点,但是并不删除。如果队列为空,抛出异常
	 */
	private static void elementTest() {
		ArrayBlockingQueue<Integer> blockingQueue = new ArrayBlockingQueue<Integer>(2);
		blockingQueue.element();
	}

	/**
	 * offer 方法用来插入一个元素。如果添加成功会返回 true,而如果队列已经满了,返回false
	 */
	private static void offerTest() {
		ArrayBlockingQueue<Integer> blockingQueue = new ArrayBlockingQueue<Integer>(2);
		System.out.println(blockingQueue.offer(1));
		System.out.println(blockingQueue.offer(2));
		System.out.println(blockingQueue.offer(3));
	}

	/**
	 * poll 方法作用也是移除并返回队列的头节点。 如果队列为空,返回null
	 */
	private static void pollTest() {
		ArrayBlockingQueue<Integer> blockingQueue = new ArrayBlockingQueue<Integer>(3);
		blockingQueue.offer(1);
		blockingQueue.offer(2);
		blockingQueue.offer(3);
		System.out.println(blockingQueue.poll());
		System.out.println(blockingQueue.poll());
		System.out.println(blockingQueue.poll());
		System.out.println(blockingQueue.poll());
	}

	/**
	 * peek 方法返回队列的头元素但并不删除。 如果队列为空,返回null
	 */
	private static void peekTest() {
		ArrayBlockingQueue<Integer> blockingQueue = new ArrayBlockingQueue<Integer>(2);
		System.out.println(blockingQueue.peek());
	}

	/**
	 * put 方法的作用是插入元素。如果队列已满就无法继续插入,阻塞插入线程,直至队列空出位置
	 */
	private static void putTest() {
		BlockingQueue<Integer> blockingQueue = new ArrayBlockingQueue<Integer>(2);
		try {
			blockingQueue.put(1);
			blockingQueue.put(2);
			blockingQueue.put(3);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}

	/**
	 * take 方法的作用是获取并移除队列的头结点。如果执队列里无数据,则阻塞,直到队列里有数据
	 */
	private static void takeTest() {
		BlockingQueue<Integer> blockingQueue = new ArrayBlockingQueue<Integer>(2);
		try {
			blockingQueue.take();
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}
}

结束语

标签:队列,编程,阻塞,System,println,ArrayBlockingQueue,BlockingQueue,blockingQueue
来源: https://www.cnblogs.com/zfcq/p/15863461.html