小豹子带你看源码:Java 线程池(一)缘起 & 计划

1 缘起

怎么想起来看线程池的代码?

很简单,由于我不会用。
原先遇到用线程池一直是 Executors 直接构造一个出来。啊,newFixedThreadPool 就是建立定容线程池,线程数是固定的;newSingleThreadExecutor 就是建立一个单线程的任务队列,一个一个执行,好简单啊,线程池不过如此。
然而有一天我读了《阿里巴巴 Java 开发手册》,手册第一章第六条第四点明确指出:java

【强制】线程池不容许使用 Executors 去建立,而是经过 ThreadPoolExecutor 的方式,这样的处理方式让写的同窗更加明确线程池的运行规则,规避资源耗尽的风险。
说明:Executors 返回的线程池对象的弊端以下:
1)FixedThreadPoolSingleThreadPool:容许的请求队列长度为 Integer.MAX_VALUE,可能会堆积大量的请求,从而致使 OOM。
2)CachedThreadPoolScheduledThreadPool:容许的建立线程数量为 Integer.MAX_VALUE,可能会建立大量的线程,从而致使 OOM。post

而当我想尝试手动实例化 ThreadPoolExecutor 时:学习

public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory, RejectedExecutionHandler handler) 复制代码

复杂的构造器令我望而却步,当我“X度”Java 线程池时,呈现给个人大多都是 Executors 的用法以及关于线程池的基本介绍,能把 ThreadPoolExecutor 讲清楚的没有几个(也或许是小豹子笨,看不太懂),所以我以为,去看官方文档,去看代码才能最直观的去理解其中的原理!spa

小豹子想说:各位初学的小萌新,必定养成看官方文档的习惯(最好直接看英文的,官方文档即使是中文,翻译每每也滞后,我就被旧版本的 Spring 中文官方文档坑过)。官方文档是最了解该程序的人写的最正确的文档,这里边有什么坑,有什么骚操做,官方文档都会一一告诉你。
而“X度”的各类博客,咱们很难保证其正确性,不要迷信它们,要“批判性”的欣赏,毕竟写博客是没有门槛的(就连我一个豹子都能写 ʅ(´◔౪◔)ʃ )。写的好的博客每每是记录解决一个问题的历程,或者对于某功能实现本身的创新等等,咱们能够从中窥见博主的思想与思路。而罗列知识点类的、粗而广介绍类的、没有博主本身的思想蕴含在其中的博客,恕小豹子直言,不如去看官方文档。线程

2 计划

ThreadPoolExecutor 是一个两千行的大类,不要紧咱们一点一点去啃它。但内容实在太多,因此我以为用系列文章的形式来记录我学习代码的过程比较好:翻译

  1. 介绍为何,以及打算怎么作
  2. 阅读类初始化及构造器代码,弄清楚咱们 new 了一个什么东西
  3. 当咱们提交一个任务时,发生了什么
  4. 如何控制线程池的行为
  5. 如何扩展线程池以实现咱们自定的特性

阅读代码时,小豹子的经验是:必定要观察动态的代码!要边调试边看代码,观察变量运行时的状态。但愿你能陪着小豹子一块儿,一步一步调试,查看本身机器上代码的运行状态,主动思考,咱们会成长更多。调试

系列文章

小豹子仍是一个大三的学生,小豹子但愿你能“批判性的”阅读本文,对本文内容中不正确、不稳当之处进行严厉的批评,小豹子感激涕零。code

相关文章
相关标签/搜索