🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
[toc] ## 1、线程池的工作原理; ![](https://img.kancloud.cn/8d/4e/8d4e9da6f7b5513cea715a1fba0a67fa_445x537.png) 1、提交任务后,线程池先判断线程数是否达到了核心线程数(corePoolSize)。如果未达到线程数,则创建核心线程处理任务;否则,就执行下一步; 2、接着线程池判断任务队列是否满了。如果没满,则将任务添加到任务队列中;否则,执行下一步; 3、接着因为任务队列满了,线程池就判断线程数是否达到了最大线程数。如果未达到,则创建非核心线程处理任务;否则,就执行饱和策略,默认会抛出RejectedExecutionException异常。 > 创建非核心线程的优先级是最低的,因为其代价比较大。 ## 2、CPU密集型和IO密集型的配置 ### 非核心线程的消亡时间的设置,是怎么实现的? 1. 所有的线程都是一样的,并没有区分是核心线程还是非核心线程,只是在没有任务的时候,过了超时时间会有一些线程结束执行退出,剩下的就是核心线程了。 2. runworker()方法里会通过while死循环获取任务,当线程数量大于核心线程数量时,获取任务为null时,会执行线程销毁操作——线程是作为存放在HashSet<Worker>中的,执行remove()操作即可。`java/util/concurrent/ThreadPoolExecutor.java:1134` ``` final void runWorker(Worker w) { Thread wt = Thread.currentThread(); Runnable task = w.firstTask; w.firstTask = null; w.unlock(); // allow interrupts boolean completedAbruptly = true; try { while (task != null || (task = getTask()) != null) { w.lock(); // 省略一部分代码 } completedAbruptly = false; } finally { processWorkerExit(w, completedAbruptly); } } ``` ### 线程的复用机制是怎么实现的?