你们知道,“当使命数超越线程池的中心线程数时,怎么让它不进入行列,而是直接启用最大线程数”吗?

大家好,我是Mic,一个作业了14年的Java程序员

刚刚这个问题是一个作业5年的粉丝最近去某互联网公司面试遇到的。

关于这个问题,我把高手的答复整理到了一个15W字的面试文档里面。

大家可以私信我收取

下面看看高手的答复

高手

当咱们提交一个使命到线程池的时分,它的作业原理分为四步。

  • 第一步,预热中心线程
  • 第二步,把使命添加到堵塞行列
  • 第三步,假如添加到堵塞行列失败,则创立非中心线程添加处理功率
  • 第四步,假如非中心线程数达到了阈值,就触发回绝策略

所以,假如希望这个使命不进入行列,那么只需要去影响第二步的履行逻辑就行了。

Java中线程池供给的结构办法里面,有一个参数可以修正堵塞行列的类型。

其中,就有一个堵塞行列叫SynchronousQueue, 这个行列不能存储任何元素。

它的特性是,每出产一个使命,就必须要指派一个顾客来处理,否则就会堵塞出产者。

根据这个特性,只要把线程池的堵塞行列替换成SynchronousQueue。

就可以避免使命进入到堵塞行列,而是直接发动最大线程数去处理这个使命。

总结

这个问题考察的角度其实挺有意思。

它能筛选掉很多靠背面试题去准备面试的同学。

但凡你了解过线程池的作业原理以及阅读过源码你都能容易的答复出来。

大家记得点赞保藏加重视!!!

版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Mic带你学架构
假如本篇文章对您有协助,还请帮忙点个重视和赞,您的坚持是我不断创造的动力。欢迎重视同名微信公众号获取更多技能干货!

本文来源:【Java面试】当使命数超越线程池的中心线程数时,怎么让它不进入行列,而是直接启用最大线程数