Hydra:假定有多个线程在执行take办法,当第一个线程进入时,堆顶元素还没有到期,那么会将leader指向本人,然后阻塞本人一段时间。假设在这时期有其他线程抵达,会由于leader不为空阻塞本人。
当第一个线程阻塞完毕后,假设将堆顶元素弹出成功,那么first指向的元素应该被gc回收掉。但是假设还被其他线程持有的话,它就不会被回收掉,所以将first置为空可以协助完成渣滓回收。
面试官:我突然有一个发散性的疑问,定时义务线程池ScheduledThreadPoolExecutor,底层运用的也是DelayQueue吗?
Hydra:成绩很不错,但很遗憾并不是,ScheduledThreadPoolExecutor在类中本人定义了一个DelayedWorkQueue外部类,并没有直接运用DelayQueue。不过假设你看一下源码,就会看到它们完成的逻辑基本分歧,异样是基于二叉堆的上浮、下沉、扩容,也异样基于leader、锁、条件等候等操作,只不过本人用数组又完成了一遍而已。说白了,看看两个类的作者,都是Doug Lea大神,所以差异基本没有多大。
面试官:好了,明天先到这吧,能最后再总结一下吗?
Hydra:DelayQueue全体了解起来也没有什么困难的点,难的中央在前面聊优先级队列的时分基本曾经扫清了,新加的东西也就是一个关于leader线程的操作,运用了leader线程来增加不必要的线程等候时间。
面试官:明天的面试有点短啊,总是有点意犹未尽的觉得,看来下次得给你加点料了。
Hydra:…
【编辑引荐】
微软开源的可视化神器,上手太酷炫了
Cube.js:试试这个新的数据剖析开源工具
为什么在 2021 年我依然引荐你运用 Linux
微软 Windows 11 晋级运转并非必须满足 TPM 2.0 ,但需求 TPM 1.2 以上
Windows 11硬件要求难倒玩家 TPM 2.0模块价钱暴涨3倍
(责任编辑:admin)