英文注释解释的很明白,execute在线程创建方面有会进行3种情况考虑
1 本身workthread 小于 coresize 则果断进行创建 2 线程池处于运行状态,将要执行的命令进行入队,这个入队就是我们在创建线程池时使用的队列,我这里用的是128个 3 进入到第三部可能是线程池已经关闭了,或者是队列已经满了,如果是关闭,这一步肯定会失败,如果是队列满了那么也是同样的,之所以要再直接创建工作线程,是因为可能这个瞬间刚好有机会创建,因此不放弃这种可行性。 4 哦豁是这样随后我就行了debug大法,发现一开始的2个消费者线程都是创建的十分的顺利,但是后面的线程任务就没办法了创建出新的线程了。
仔细观察,发现是if (workerCountOf(recheck) == 0)到这一步判断不满足条件,就不往下进行创建了。
那么是为什么呢? 哦原来是因为使用了死循环,尽管是阻塞队列,但线程却被死死地占用了。这个判断值不会为0. 于是就一直只有一个topic在消费消息。
至于卡住的原因也很简单,使用阻塞队列,一定是某一个阻塞了。从后面观察来看,是生产者的缓冲队列满了。只进行到32的原因,也是因为刚好每个消费者的缓冲队列是32的大小。4个就是一个生产者的队列长度。当第一批128个分发玩了以后,从129开始,给topic的队列已经满了,put进行的阻塞。于是生产者和消费者处于全员懵逼的状态。
最开始没有使用死循环的代码就和一般我们写的多线程代码一样,大家都靠本事去竞争,因此每个consumer都有机会被执行。
那么最后一个问题,要想让线程池创建超过coreSize的线程要怎么做呢?从注释长短你就能看出,哪些条件比较简单,满足条件3只要我们创造多一些任务即可,或者将线程池的工作队列大小调小。(这里我选择调整队列大小,改为16,很快就创建出新的线程了)
5 结论那么线程池创建的哲学是什么?
首先,按照coreSize,创建出24h不间断休息的好员工
其次,有处理不来的工作先堆放到某个地方,等待处理
最后,核心员工不行,赶紧招募临时工,来一起进行攻坚
希望这篇文章对你理解线程池有所帮助。