核心线程数为0,任务队列容量为1的线程池是怎样工作的?

732 阅读1分钟

偶然看到这样一个问题,感觉很有意思~

一个核心线程数为0的线程池,工作队列容量也设置为1

向该线程池加入两个任务,任务1里用while循环来让它阻塞

image.png

发现最终只执行了任务1,而任务2没有被执行


它的原理其实很简单,通过线程池源码一目了然

这是线程池的execute()

image.png

所以任务1先被放进了工作队列,但是放进工作队列之后,发现当前工作线程总数为0。那么会创建新线程来执行队列中的任务,也就是创建了thread-1来执行任务1。

随后任务2被线程池执行的时候会先被放进工作队列,由于此时线程总数已经不为0了,所以任务2会在队列中乖乖的等着被执行,但是现在线程1处于阻塞的状态,所以任务2永远得不到执行。


那么我们现在如果再添加一个任务3的话,可以看到三个任务都会被执行

image.png

是因为当任务3进入线程池的时候,发现工作队列已满,就会创建新的thread-2来执行任务3,任务3执行完毕后thread-2会去从队列中取出任务2并执行