概述
是特殊的TransferQueue,它不存储元素,容量为0,必须先有消费线程等待,才能使用的队列。
synchronousQueue的独特能力
这个队列其本身是没有容量大小,即每一个put操作必须等待take操作,否则不能添加。这个线程池根据需要(新任务到来时)创建新线程,如果有空闲线程也可以重复使用,线程空闲60s后会进行回收。官方给出的注释如下:
队列不存储数据,所以没有大小,也无法迭代;
插入操作的返回必须等待另一个线程完成对应数据的删除操作,反之亦然;
队列由两种数据结构组成,分别是后入先出的堆栈和先入先出的队列,堆栈是非公平的,队列是公平的。
常用方法
boolean add(E e)
:父类方法,无阻塞,若没有消费线程阻塞等待数据,则抛出异常。put(E e)
:有阻塞,若没有消费线程阻塞等待数据,则阻塞。
源码分析
offer - 非阻塞
return transferer.transfer(e, true, 0) != null;
非阻塞doffer通过同步转移队列实现的特殊的transfer方法实现,当能存入,返回非null,则offer成功。
这里调用transfer方法传的参数2是true,即不等待
put - 阻塞
if (transferer.transfer(e, false, 0) == null) {
Thread.interrupted();
throw new InterruptedException();
}
这里调用transfer方法传的参数2是false,即需要阻塞
如果阻塞后还拿到null,抛出interrupted异常
transfer - 状态转移方法
这里判断timed,如果为true直接返回了,不阻塞
else if (timed && nanos <= 0L) // can't wait
return null;
应用
synchronousQueue的典型应用就是CachedThreadPool,是一个无队列容量的线程池
评论区