线程池的拒绝策略示例

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了线程池的拒绝策略示例相关的知识,希望对你有一定的参考价值。

参考技术A Java的线程池中,如果不断往线程池提交任务,最终会发生什么?
如果work queue是一个有界队列,队列放满,线程数量达到maxsize,且没有空闲线程时,再往线程池提交任务会触发线程池的拒绝策略。

线程池有哪些拒绝策略呢?

一共提交8个任务,其中有一个默默被丢弃。

线程池1个核心线程,max线程数为2,work queue大小为5.
可以看到,提交8个任务后,第2个任务被丢弃了。因为第2个任务是oldest,第一个被放进queue的任务。

用这种拒绝策略时要注意,主线程既需要负责创建线程,又需要执行任务,会造成性能问题。

在输出中,能看出,主线程号为1,而提交的任务中,其中一个任务(最后一个被提交的任务)就是由主线程来执行的。

了解了前四种拒绝策略,发现:
abort,discard,discardOldest都会丢弃任务;
callerRun虽然执行了任务,但是会影响主线程性能。

若将work queue设置为无界队列,或者将maxsize设置为最大整数,都有可能造成out of memory。

那么可以通过自定义拒绝策略,让后进来的task阻塞住,有资源了再处理。这样可以让每一个任务都得到执行。

以上是关于线程池的拒绝策略示例的主要内容,如果未能解决你的问题,请参考以下文章

Java线程池的拒绝策略

线程池的4种拒绝策略

第224天学习打卡(知识点回顾 线程池的拒绝策略)

线程池的手写和拒绝策略

Java并发:线程池的使用

Java线程池的拒绝策略