目 录CONTENT

文章目录

SynchronousQueue - 同步转移队列

FatFish1
2024-10-24 / 0 评论 / 0 点赞 / 44 阅读 / 0 字 / 正在检测是否收录...

概述

是特殊的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,是一个无队列容量的线程池

0

评论区