代码改变世界

线程池源码

2024-03-13 17:10  Spiderman25  阅读(1)  评论(0)    收藏  举报

总的逻辑如下,ctl是当前线程池的线程数量以及状态的记录值。

如果没有达到核心线程数量那么就添加worker,否则放到工作队列中,队列中也放不进去就再次添加worker,如果添加失败则抛异常。

 

 Worker是一个runable类型,最后启用worker生成的thread,thread内调用的是worker的run

 runWorker如下,执行task的run方法,如果task为空则从getTask方法中找。其中重写线池程中的afterExecute方法可以接收线程报错的原因。

 如果当前线程数量大于核心线程数则调用workQueue.poll(keepAliveTime, TimeUnit.NANOSECONDS),这个方法是有时间限制的,在这个时间内没有拿到线程就退出。否则就调用take方法,一直阻塞。

 退出后会调这个方法,从workers中移除掉退出的线程。

 如果添加到队列失败、添加worker也失败那么就执行拒绝策略

 

再看下submit方法,其实中把Callable转化为runable,再调用execute,

 

 

另外一个,result是最终要返回的对象

 

 完,够简单,太深入的就不了解了。