ThreadPoolExecutor 线程池工作流程
2022-08-03 14:39:00 9 举报
Java 线程池工作流程
作者其他创作
大纲/内容
是
否
提交任务
核心线程是否已满
创建核心线程,执行任务
任务队列是否已满
3、ThreadPoolExecutor.DiscardOldestPolicy 丢弃队列头部(最久)的任务,并重新尝试执行程序(如果失败,再次重试)
线程池调度过程总结:1、当线程总数量 < corePoolSize,无论线程是否空闲,都将创建核心线程执行任务。(让核心线程数量尽快打到 corePoolSize,在核心线程数 < corePoolSize 时)。需要全局锁2、当线程总数 >= corePoolSize 时,新来的线程任务会进入任务队列中等待,然后空闲的核心线程会依次去取缓存队列中取出任务执行。(线程复用)3、当缓存队列满了,证明任务已经爆棚,需要“临时工”帮忙,此时创建非核心线程执行任务。需要全局锁。4、当缓存队列满了,切线程总数量达到 maximumPoolSize,系统采用拒绝策略。
当前线程总数是否已大于等于maximumPoolSize
加入等待队列,待核心线程空闲下来被调度执行
线程池是否已满
1、ThreadPoolExecutor.AbortPolicy 默认拒绝处理策略,丢弃任务并抛出 RejectedExecutionException
创建非核心线程,调度任务
4、ThreadPoolExecutor.CallerRunsPolicy 由调用线程处理该任务
2、ThreadPoolExecutor.DiscardPolicy 丢弃新来的任务,不抛异常
按照拒绝策略处理无法执行的任务
收藏
收藏
0 条评论
回复 删除
下一页