# 《手写线程池》实战手写线程池-400行代码手写线程池

作者:冰河
星球:http://m6z.cn/6aeFbs (opens new window)
博客:https://binghe.gitcode.host (opens new window)
文章汇总:https://binghe.gitcode.host/md/all/all.html (opens new window)
源码获取地址:https://t.zsxq.com/0dhvFs5oR (opens new window)

沉淀,成长,突破,帮助他人,成就自我。

  • 本章难度:★★★☆☆
  • 本章重点:用400行代码手写线程池初始化和执行任务的核心流程以及优雅关闭的核心流程,重点掌握线程池初始化和执行任务的核心流程。从全局视角掌握线程池的核心技术原理,学会融汇贯通,将线程池的编程思想灵活应用到自身实际项目中,提升实际项目的并发处理能力,以及自身的并发编程内功功底。

大家好,我是冰河~~

实践是检验真理的唯一唯一标准,通过《手写线程池》中线程池核心技术篇章的学习,到底有没有真正掌握线程池的核心流程,我们可以自己来手写一个线程池,重点实现线程池初始化和执行任务的核心流程,以此来检验我们是否真正掌握了线程池的核心流程。

# 一、前言

线程池技术是并发编程领域中,非常重要的核心技术内容,彻底掌握线程池技术不仅可以让你从面试中脱颖而出,还能让你游刃有余的处理工作过程中遇到的系统并发编程问题,提高系统的并发处理能力。并且掌握好线程池技术,也能从根本上提升并发编程功底,进一步突破自己的技术瓶颈。 要知道,对并发编程深入理解的程度,也是普通程序员、高级程序员和架构师的一个重要分水岭。

经过线程池核心技术篇章对JDK线程池核心技术和源码的深入解析,相信小伙伴们对JDK线程池的核心流程和源码细节有了一个全新的认识,接下来,冰河就要带着各位小伙伴大约使用400行代码,来手搓一个含线程池初始化和执行任务和优雅关闭核心流程的简易版线程池。相信大家跟着冰河一起手搓下来,会对线程池的核心原理、执行流程和源码实现有一个更加深入的理解。

注意:为了让小伙伴们能够更加轻松的深入学习和理解线程池的核心技术,我也完全仿照JDK线程池实现了一版可直接运行的线程池,去除了JDK线程池中非核心的功能方法,保留了核心功能,代码已提交,大家拉取对应分支学习即可。。

# 二、本节诉求

用400行代码手写线程池初始化和执行任务的核心流程以及优雅关闭的核心流程,重点掌握线程池初始化和执行任务的核心流程。从全局视角掌握线程池的核心技术原理,学会融汇贯通,将线程池的编程思想灵活应用到自身实际项目中,提升实际项目的并发处理能力,以及自身的并发编程内功功底。

# 三、流程梳理

在正式手写线程池之前,我们再次重点梳理下手写线程池执行任务的核心流程。这里,我们直接对标JDK线程池执行任务的核心流程,如图1-1所示。


当向线程池中提交任务时,线程池执行任务的流程如下所示。

(1)向线程池提交任务时,首先会判断线程池中的线程数是否已经达到corePoolSize,如果线程池中的线程数未达到corePoolSize,则直接创建新线程执行任务。否则,进入步骤(2)。

(2)判断线程池中的工作队列是否已满,如果线程池中的工作队列未满,则将任务添加到队列中等待执行。否则,进入步骤(3)。

(3)判断线程池中的线程数是否已经达到maximumPoolSize,如果线程池中的线程数未达到maximumPoolSize,则直接创建新线程执行任务。否则,进入步骤(4)。

(4)执行拒绝策略。

梳理清楚执行流程后,接下来,我们就要开始编码实现了。

# 四、编码实现

这里,我们会从自定义异常、自定义队列、自定义拒绝策略和自定义线程池等几个角度带着大家一步步手写和实现一个简易版的线程池。

# 4.1 实现自定义异常

自定义异常用来统一封装手写线程池时对外抛出的异常。

源码详见:io.binghe.framework.plugin.concurrent.exception.ConcurrentException。

# 查看完整文章

加入冰河技术 (opens new window)知识星球,解锁完整技术文章、小册、视频与完整代码