线程池的拒绝策略示例

如题所述

第1个回答  2022-07-23
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线程池拒绝策略
CallerRunsPolicy: 由提交任务的线程直接执行被拒绝的任务,workQueue中的任务在该线程中运行。 DiscardOldestPolicy: 丢弃最旧的任务后尝试重新执行当前任务,workQueue为空或线程池关闭时,当前任务会被丢弃。要自定义拒绝策略,可以实现RejectedExecutionHandler接口,如示例中所示,将自定义的handler传递给ThreadP...

线程池的拒绝策略示例
线程池有哪些拒绝策略呢?一共提交8个任务,其中有一个默默被丢弃。线程池1个核心线程,max线程数为2,work queue大小为5.可以看到,提交8个任务后,第2个任务被丢弃了。因为第2个任务是oldest,第一个被放进queue的任务。用这种拒绝策略时要注意,主线程既需要负责创建线程,又需要执行任务,会造成...

面试突击30:线程池是如何执行的?拒绝策略有哪些?
默认拒绝策略即中止策略(AbortPolicy),当任务队列已满且线程数达到上限时,执行此策略,线程池会抛出异常并中止执行任务。忽略任务策略(DiscardPolicy)忽略任务策略(DiscardPolicy)在任务队列已满时忽略最新任务,避免过多任务堆积,示例代码如下。中止策略(AbortPolicy)中止策略(AbortPolicy)在任务队列已...

面试突击30:线程池是如何执行的?拒绝策略有哪些?
线程池的拒绝策略主要有四种:默认的AbortPolicy(中止策略),当队列满且无法执行时,会抛出异常并停止任务;DiscardPolicy(忽略策略)则是忽略最新任务;还有JDK提供的其他策略,如直接拒绝任务(RejectedExecutionException)。通过示例代码,我们看到DiscardPolicy和AbortPolicy的区别:前者忽略任务,后者则导致任务...

Java的并行世界-3.0 线程池与拒绝策略
Handler是RejectedExecutionHandler接口类型,代表了不同的拒绝策略。常见的拒绝策略包括:CallerRunsPolicy:如果线程池未关闭,会直接在调用者当前线程执行等待队列放不下的任务。AbortPolicy:会直接抛出异常,阻止系统正常运行。DiscardPolicy:直接丢失无法放入等待队列的任务,不做异常抛出。DiscardOldestPolicy:丢弃...

线程池四种拒绝策略
四种线程池拒绝策略,各有适用场景。AbortPolicy策略特点在于,当线程池无法接受新任务时,直接抛出一个运行时异常,不执行此任务。适用于对任务丢失敏感的场景,希望立即知道并处理该异常。DiscardPolicy策略则更为简单,当线程池无法接受新任务时,直接丢弃被拒绝的任务,不会抛出异常,可能造成数据丢失。适用...

Java多线程之ThreadPoolExecutor原理(图文代码实例详解)
workQueue是任务队列,是用来保持task,该队列保持住了Runnable的任务,通过调用线程池的execute的方法. threadFactory创建线程的工厂 RejectedExecutionHandler是当线程数超过限制以及队列也满了,需要执行的拒绝策略. 成员变零privatefinalAtomicIntegerctl=newAtomicInteger(ctlOf(RUNNING,0));privatestaticfinalintCOUNT_BITS=Intege...

线程池四种拒绝策略
线程池的四种拒绝策略:平衡任务处理与资源利用的艺术1.AbortPolicy - 强制执行与实时感知 当线程池满载,AbortPolicy策略将果断拒绝新任务,直接抛出运行时异常。这种策略适用于对任务处理的实时性要求极高,不容许任务丢失的场景,它立即通知调用者任务已被拒绝,以便及时调整处理策略。2. DiscardPolicy - ...

Java ThreadPoolExecutor的拒绝策略
线程池技术在项目中广泛应用,提供四种拒绝策略:CallerRunsPolicy、AbortPolicy、DiscardPolicy、DiscardOldestPolicy。AbortPolicy策略直接抛出异常,拒绝后续任务执行;CallerRunsPolicy策略通过调用execute函数的上层线程执行被拒绝任务,可能导致主线程阻塞;DiscardPolicy策略简单直接,拒绝任务时不抛异常,也不执行,任务被...

线程池有哪4种拒绝策略?
为了直观展示拒绝策略的使用,以DiscardPolicy为例,代码如下:它将忽略线程池添加的额外任务。执行结果表明,线程池只执行了预定的两个任务,其他任务由于DiscardPolicy被忽略。AbortPolicy拒绝策略的实现与DiscardPolicy相似,但其行为更为激进。程序会执行至预定的两个任务,随后尝试执行的两个任务将抛出异常,...

相似回答
大家正在搜