代码语言:javascript 复制 publicstaticclassCallerRunsPolicyimplementsRejectedExecutionHandler{publicCallerRunsPolicy(){}publicvoidrejectedExecution(Runnable r,ThreadPoolExecutor e){if(!e.isShutdown()){r.run();}}} 功能:当触发拒绝策略时,只要线程池没有关闭,就由提交任务的当前线程处理。 使用场景:一般在不允许...
import java.util.concurrent.*; public class CallerRunsPolicyExample { public static void main(String[] args) { // 创建一个固定大小的线程池,并设置拒绝策略为CallerRunsPolicy ThreadPoolExecutor executor = new ThreadPoolExecutor( 2, 2, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<>(2),...
2.4 CallerRunsPolicy策略 测试代码块:(添了CallerRunsPolicy拒绝策略) private void callerRunsPolicy() {ThreadFactory factory2 = r -> new Thread(r, "TestThreadPool");// 核心线程数、最大线程数 和 阻塞队列大小均为2ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(2,2,0,TimeUnit.SECONDS,ne...
CallerRunsPolicy(调用者运行策略) 功能:当触发拒绝策略时,只要线程池没有关闭,就由提交任务的当前线程处理。 当线程池无法接受新任务时,CallerRunsPolicy 会让提交任务的线程自己执行该任务。 使用场景:一般在不允许失败、对性能要求不高、并发量较小的场景下使用,但可能会阻塞后续任务执行。例如在不允许失败的、对性能...
线程池中的线程已经用完了,无法继续为新任务服务,同时,等待队列也已经排满了,再也塞不下新任务了。这时候我们就需要拒绝策略机制合理的处理这个问题。 JDK 内置的拒绝策略如下: 1.AbortPolicy : 直接抛出异常,阻止系统正常运行。 2.CallerRunsPolicy : 只要线程池未关闭,该策略直接在调用者线程中,运行当前被丢弃的...
2. CallerRunsPolicy CallerRunsPolicy不抛弃任务,而是将任务的执行权交由调用者线程来执行。这种策略有助于减缓任务提交速度,从而控制系统负载。 示例代码 importjava.util.concurrent.*;publicclassCallerRunsPolicyExample{publicstaticvoidmain(String[]args){ThreadPoolExecutorexecutor=newThreadPoolExecutor(1,1,0L,TimeUnit...
更换拒绝策略,将上面的AbortPolicy换成CallerRunsPolicy。 RejectedExecutionHandlerhandler=newThreadPoolExecutor.CallerRunsPolicy(); 执行任务,输出: 执行任务:1执行任务:4执行任务:3执行任务:2执行任务:5 最大线程数 + 阻塞队列 = 3,多余的任务还是继续被执行。
CallerRunsPolicy(调用者运行策略) 特点:在调用者线程中直接执行被拒绝的任务。 应用场景:适用于系统不希望丢弃任务,并且对任务的执行延迟要求不高的情况。 示例:在日志系统中,如果日志记录任务被拒绝,可以选择在调用者线程中直接执行,以避免日志丢失。 DiscardPolicy(丢弃策略) 特点:默默丢弃无法处理的任务,不抛出异常。
CallerRunsPolicy是Java线程池中的一种拒绝策略,当线程池中的线程数达到其最大容量,并且工作队列也满了,无法再接受新的任务时,使用CallerRunsPolicy策略会将任务交由调用者线程(即提交任务的线程)来执行。如果调用者线程已经在执行一个任务,则会创建一个新线程来执行被拒绝的任务。
CallerRunsPolicy:这是默认的拒绝策略,当线程池队列已满并且无法处理新任务时,将由提交任务的线程来执行该任务。这种策略可以降低新任务的流量,但也会增加提交任务的线程的负载。 AbortPolicy:当线程池队列已满并且无法处理新任务时,将抛出RejectedExecutionException异常,阻止新任务的提交。