10年架构师经验带你详细解析四种线程池( 二 )


适合场景:大量的小任务(每个任务处理快,不会频繁出现线程处理一半时,切换其他线程) 。
ScheduledThreadPool
public ScheduledThreadPoolExecutor(int corePoolSize) { super(corePoolSize, Integer.MAX_VALUE, 0, NANOSECONDS, new DelayedWorkQueue()); }我们可以看到该线程池的corePoolSize核心线程数量和maximumPoolSize最大线程数量都是1,代表该线程有且只有一个固定的线程,既然是单线程,所以该线程池实现的是串行操作,没有并发效果 。workQueue是LinkedBlockingQueue,这是一个链表阻塞队列 。所以该线程池适合执行串行执行队列中的任务 。
适合场景:按顺序串行处理的任务 。
可能读者会好奇keepAliveTime为0代表的含义? 是立即回收线程还是永不回收呢?
keepAliveTime参数注释明确指明只对非核心线程有用 。我们可以从ScheduledThreadPool的源码中推测,如果0代表是永不回收的话,那么ScheduledThreadPool一旦创建出非核心线程的话就不会回收了?这样是很不合理的 。所以笔者认为0代表立即回收 。
public ScheduledThreadPoolExecutor(int corePoolSize) { super(corePoolSize, Integer.MAX_VALUE, 0, NANOSECONDS, new DelayedWorkQueue()); }此文章如有错误恳请评论指正 。希望能通过这篇文章让大家对线程池有更深的理解 。
最后,需要关于分布式,微服务,性能优化,Spring,MyBatis,MySQL数据库等等的源码知识点请关注我哦!还有各种常见面试题详解 。(关注+转发,私信我“学习”,就可以领取架构资料了哦!)
我是小架,祝大家工作上能够事业有成,学习上也可以打破瓶颈一路向上!

【10年架构师经验带你详细解析四种线程池】


推荐阅读