首先我们先来看下概念:
核心线程数(Core Pool Size): 线程池中能保持活动。。。
最大线程数(Maximum Pool Size): 线程池中允许存在的。。。
任务队列(Work Queue): 用来保存等待执行的任务的队列。当线程池。。。
线程存活时间(Keep Alive Time): 只有在线程池的线程数超过核心线程数。。。
确实有点麻烦去理解,那我来翻译一下:
我现在开了一家海底捞火锅店,假设每桌客人都点了拉面
核心线程数:拉面师傅
最大线程数:餐厅的座位
任务队列:美甲小姐姐
线程存活时间:临时雇来的拉面师傅工作时间
餐厅开始接待客人。。
客人如潮水般涌来,开始进店的客人安排上拉面师傅拉拉面。
拉面师傅都在忙,其他客人全都去做美甲,暂时稳住客人。
美甲小姐姐都在忙,赶紧去找临时拉面师傅,临时拉面师傅开始拉拉面。
所有座位全部坐满,拉面师傅照顾一批,美甲小姐姐照顾一批,临时拉面师傅照顾一批。
再有新客人进来就拒绝了。
拒绝客人后会有以下四种反应:
1.投诉海底捞总部,上级来处理这个问题。
2.受了一肚子气,憋在肚子里自己受。
3.不吃了。
4.找到里面美甲小姐姐照顾的客人,把它赶出去,自己坐下。
大家可以对比一下,原文是这样的
核心线程数(Core Pool Size): 线程池中能保持活动的最小线程数。即使线程处于空闲状态,核心线程也会一直存活,除非设置了适当的超时策略。
最大线程数(Maximum Pool Size): 线程池中允许存在的最大线程数。当任务队列满了且活动线程数达到核心线程数时,线程池会创建新的线程,直到达到最大线程数。超过最大线程数的任务将会根据拒绝策略进行处理。
任务队列(Work Queue): 用来保存等待执行的任务的队列。当线程池中的线程数达到核心线程数时,新任务会被放入任务队列中。如果任务队列已满,且线程数未达到最大线程数,则会创建新的线程来执行任务。
线程存活时间(Keep Alive Time): 只有在线程池的线程数超过核心线程数时,多出来的空闲线程才会根据这个参数来决定回收。
这些参数之间的关系如下:
当有新任务需要执行时,线程池会优先尝试使用核心线程来处理任务。
如果任务队列已满,且线程数未达到最大线程数,则会创建新的线程来处理任务。
当线程池中的线程数超过核心线程数,并且任务队列已满时,新任务会根据拒绝策略进行处理。
拒绝策略(Rejected Execution Handler)定义了当线程池无法执行新任务时采取的处理方式。常见的拒绝策略包括:
- AbortPolicy(默认): 抛出 RejectedExecutionException 异常,阻止系统正常工作。
- CallerRunsPolicy: 将任务返回给调用者,由调用者所在线程执行。
- DiscardPolicy: 直接丢弃任务,不提供任何反馈。
- DiscardOldestPolicy: 丢弃队列中等待时间最长的任务,然后尝试再次提交当前任务。