线程池有哪4种拒绝策略?

如题所述

线程池执行流程始于核心方法 execute()。当任务进入线程池,池会首先判断当前线程数量是否超过核心线程数。若未超过,则新建线程执行任务;否则,会检查任务队列是否已满,若未满,则将任务添加至队列等待执行;若队列已满,再检查线程数量是否达到最大限制,若未达上限,则创建新线程执行任务;若所有条件均未满足,线程池将执行拒绝策略。

线程池的拒绝策略有四种默认实现:AbortPolicy、DiscardPolicy、DiscardOldestPolicy 和 CallerRunsPolicy。其中,AbortPolicy会导致任务执行被中断并抛出异常;DiscardPolicy会忽略任务,不再执行;DiscardOldestPolicy会丢弃队列中最旧的任务;而CallerRunsPolicy则由调用者线程执行任务。

为了直观展示拒绝策略的使用,以DiscardPolicy为例,代码如下:它将忽略线程池添加的额外任务。执行结果表明,线程池只执行了预定的两个任务,其他任务由于DiscardPolicy被忽略。

AbortPolicy拒绝策略的实现与DiscardPolicy相似,但其行为更为激进。程序会执行至预定的两个任务,随后尝试执行的两个任务将抛出异常,表明它们已被拒绝执行。

通过自定义RejectedExecutionHandler并重写rejectedExecution方法,开发者可以实现自定义拒绝策略。这为线程池提供了额外的灵活性,使其能够根据特定需求调整行为。

线程池执行流程的三个关键判断点确保了任务的合理分配和处理。流程从判断当前线程数量、任务队列状态到最大线程数,形成了一套完整且灵活的任务执行机制。JDK提供的四种拒绝策略,以及通过自定义实现的策略,提供了丰富的选项,满足了不同场景下的任务处理需求。
温馨提示:内容为网友见解,仅供参考
无其他回答

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

线程池四种拒绝策略
CallerRunsPolicy策略,当有新任务提交后,如果线程池没被关闭且没有能力执行,则把这个任务交于提交任务的线程执行。不会抛出异常,适用于希望调用者自己处理被拒绝的任务的场景,通常是由调用者自身的线程来执行被拒绝的任务。AbortPolicy策略的两个优点是,新提交的任务不会被丢弃,不会造成业务损失。此策...

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

Java线程池拒绝策略
Java线程池在处理超过最大容量时,会采用预定义或自定义的拒绝策略。默认情况下,ThreadPoolExecutor提供了四种策略:DiscardPolicy: 任务被拒绝时不采取任何操作,直接丢弃,源码中表现为一个空的rejectedExecution方法。 AbortPolicy: 拒绝时抛出RejectedExecutionException,中断执行流程,线程会捕获这个异常。

线程池有哪4种拒绝策略?
线程池的拒绝策略有四种默认实现:AbortPolicy、DiscardPolicy、DiscardOldestPolicy 和 CallerRunsPolicy。其中,AbortPolicy会导致任务执行被中断并抛出异常;DiscardPolicy会忽略任务,不再执行;DiscardOldestPolicy会丢弃队列中最旧的任务;而CallerRunsPolicy则由调用者线程执行任务。为了直观展示拒绝策略的使用,以...

面试突击30:线程池是如何执行的?拒绝策略有哪些?
线程池的拒绝策略包括默认的中止策略、忽略任务策略、自定义拒绝策略等四种。默认拒绝策略 默认拒绝策略即中止策略(AbortPolicy),当任务队列已满且线程数达到上限时,执行此策略,线程池会抛出异常并中止执行任务。忽略任务策略(DiscardPolicy)忽略任务策略(DiscardPolicy)在任务队列已满时忽略最新任务,避免...

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

面试官:如果不允许线程池丢弃任务,应该选择哪个拒绝策略?
线程池的拒绝策略在程序运行过程中扮演着重要角色。当线程池满载,队列已满,线程池会根据预先设置的拒绝策略处理新来的任务。常见的拒绝策略包括AbortPolicy、DiscardPolicy、DiscardOldestPolicy和CallerRunsPolicy。AbortPolicy策略会在队列满时抛出异常,防止任务被丢弃。然而,CallerRunsPolicy策略与众不同,它不会...

线程池的拒绝策略示例
如果work queue是一个有界队列,队列放满,线程数量达到maxsize,且没有空闲线程时,再往线程池提交任务会触发线程池的拒绝策略。线程池有哪些拒绝策略呢?一共提交8个任务,其中有一个默默被丢弃。线程池1个核心线程,max线程数为2,work queue大小为5.可以看到,提交8个任务后,第2个任务被丢弃了。

Java的并行世界-3.0 线程池与拒绝策略
handler:拒绝策略,当线程池和队列都满了,无法继续接受新的任务时,会触发拒绝策略来处理新的任务。常见的拒绝策略包括AbortPolicy(默认策略,直接抛出异常)、CallerRunsPolicy(由调用线程来执行被拒绝的任务)、DiscardPolicy(丢弃被拒绝的任务)、DiscardOldestPolicy(丢弃队列中最老的任务)。ThreadPool...

相似回答
大家正在搜