线程池源码
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是最终要返回的对象


完,够简单,太深入的就不了解了。
浙公网安备 33010602011771号