线程池里面的队列跟之前学习的队列不一样,之前学习的队列Deque是非阻塞的队列,但是在JUC包里面的队列是阻塞队列;
什么是阻塞队列?如果队列中没有元素的情况下获取元素(出队),程序不会结束一直阻塞。
线程池中的阻塞队列主要有两种
LinkedBlockingQueue:默认是一个无界限的队列,可以说元素是Interger的最大值
SynchronousQueue:队列中最多只能容纳一个元素,单线程无法操作该队列必须通过多线程来操作,队列核心思想是生产者和消费者模式。生产者向队列放入元素,但是消费这没有取走,此时队列就会阻塞。
LinkedBlockingQueue
场景1:定义一个LinkedBlockingQueue默认容量3,执行循环向队列中放入5个元素
public class LinkBlockingQueueTest {
public static void main(String[] args) {
BlockingQueue<Integer> queue = new LinkedBlockingQueue<>(3);
try {
/** * 此时队列容量3,循环体执行第4次的时候由于没有出队,队列已满的情况下不能继续put(E)第4个元素
* 此时操作队列的当前线程进入WAIT状态 * 注意: 使用阻塞队列一定要在编译期确定容量,否则就不知道到底能容纳多少个元素。不允许无参 */ for (int i = 0; i < 5; i++) {
queue.put(i+1);
}
}catch(Exception e){
e.printStackTrace();
}
}