资讯动态

线程池的执行流程是什么?

发布时间:2026/10/18 14:46:30 来源:尧图企业网站定制
一、线程池执行流程JavaThreadPoolExecutor线程池的任务调度逻辑核心实现在execute()方法。当向线程池提交任务时会按照下面这套固定流程处理1. 提交任务调用线程池execute()提交任务线程池开始判断当前存活工作线程数量。2.判断是否小于核心线程数 corePoolSize如果存活线程数小于 corePoolSize直接新建核心线程来执行这个任务。如果存活线程数大于等于 corePoolSize不会立刻新建线程尝试把任务放进工作队列 workQueue。3.判断工作队列workQueue 是否已满队列未满任务入队排队等待空闲线程去队列里取任务执行。队列已满队列无法接收新任务继续判断当前存活线程数量。4.判断是否达到最大线程数 maximumPoolSize存活线程数小于 maximumPoolSize新建非核心线程直接执行当前任务。存活线程数等于 maximumPoolSize线程池资源全部耗尽触发拒绝策略处理任务。5.执行拒绝策略如果当前存活线程数达到了 maximumPoolSize 最大线程数直接执行拒绝策略处理如抛出异常、丢弃任务等。6.执行任务无论是创建的核心线程、非核心线程还是分配的空闲线程最终都会走到执行线程任务这一步。二、源码实现代码如下示例publicvoidexecute(Runnablecommand){if(commandnull)thrownewNullPointerException();intcctl.get();// 1. 判断存活线程数 corePoolSize创建核心线程if(workerCountOf(c)corePoolSize){if(addWorker(command,true))return;cctl.get();}// 2. 判断是否入队成功if(isRunning(c)workQueue.offer(command)){// 入队成功二次检查是否需要补充线程intrecheckctl.get();if(!isRunning(recheck)remove(command))reject(command);elseif(workerCountOf(recheck)0)addWorker(null,false);}// 3. 队列已满尝试创建非核心线程elseif(!addWorker(command,false)){// 4. 创建失败达到 maximumPoolSize执行拒绝策略reject(command);}}流程总结核心线程满 → 进队列 → 队列满 → 建非核心线程 → 最大线程满 → 拒绝策略。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑