设计简述
一个设计方案一定是从最小的架子慢慢搭建起来的,那么想一下,最基础的线程池应该是什么样子的?
【1】需要有线程源。比较线程池说白了就是一个存放线程的容器,自身不生产线程。(当然了,如果暂时不接入线程工厂的话,循环new也是一种最基本的方案)
【2】需要有一个工作队列。我们的程序是一个进程,每个请求到达web容器,都会被创建一个线程(不一定,取决于web容器怎么配置的),那么同一时间可能有多个线程想要向工作队列提交任务,为了避免任务丢失,我们应该保证对队列的操作是同步的。另一方面,调度线程负责从这个队列中取出任务,然后委托一个线程去执行它。这个线程就是工作线程,当它执行完第一个被调度线程委托的任务后,它就会继续监听工作队列。
【3】线程集合。我们引入线程池的目的就是为了管理线程,线程不再是临时工,而是“有编制”的正式员工。而且此线程一般也不再是Thread,因为Thread对象对线程的描述是非常基本的,而我们先让这个线程能够保存更多信息就需要为它多穿几层衣服。
嗯,以上就是最必要的几个东西,至于各种coreSize、maxSize、线程池状态等,我们可以通过后期进行补充,而以上三样东西则是缺一不可。面试中,如果能把这三个核心的要素点出来基本就差不多了。
简单实现
提前说明:本实现中不考虑任务取消、线程池销毁等,仅仅为了构建出一个线程池的架子。
我们暂时不考虑核心与非核心线程,我们统一将线程池内部的工作线程设计为正式员工。
class workThread extends Thread{
private BlockingQueue<Runnable> workQueue;
public workThread(BlockingQueue<Runnable