线程池四种拒绝策略

如题所述

第1个回答  2024-09-02
四种线程池拒绝策略,各有适用场景。

AbortPolicy策略特点在于,当线程池无法接受新任务时,直接抛出一个运行时异常,不执行此任务。适用于对任务丢失敏感的场景,希望立即知道并处理该异常。

DiscardPolicy策略则更为简单,当线程池无法接受新任务时,直接丢弃被拒绝的任务,不会抛出异常,可能造成数据丢失。适用于对任务丢失不敏感的场景。

DiscardOldestPolicy策略会丢弃任务队列中的头结点,通常是存活时间最长并且未被处理的任务。适用于对新任务优先级较高的场景,当线程池无法接受新任务时,会丢弃一些等待时间较长的旧任务,以便接受新任务。

CallerRunsPolicy策略,当有新任务提交后,如果线程池没被关闭且没有能力执行,则把这个任务交于提交任务的线程执行。不会抛出异常,适用于希望调用者自己处理被拒绝的任务的场景,通常是由调用者自身的线程来执行被拒绝的任务。

AbortPolicy策略的两个优点是,新提交的任务不会被丢弃,不会造成业务损失。此策略提供简单的反馈控制机制,能够减缓新任务的提交速度。提交任务的线程需要负责执行任务,执行任务耗时的期间,提交任务的线程被占用,不再提交新的任务,减缓了任务提交的速度,相当于是一个负反馈。在此期间,线程池中的线程也可以充分利用这段时间来执行掉一部分任务,腾出一定的空间,相当于给了线程池一定的缓冲期。

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

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

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

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

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

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

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

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

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

ThreadPoolExecutor简介&源码解析
创建线程池需要考虑关键参数,如核心线程数(任务开始执行时立即创建),最大线程数(任务过多时限制新线程生成),线程存活时间,任务队列大小,线程工厂以及拒绝策略。JDK提供了四种拒绝策略,如默认的AbortPolicy,当资源饱和时抛出异常。此外,线程池还提供了beforeExecute和afterExecute钩子函数,用于在任务...

相似回答
大家正在搜