在Java中,ThreadPoolExecutor
提供了四种内置的拒绝策略,分别是:
- AbortPolicy(默认策略):当提交的任务无法被接受执行时,会直接抛出
RejectedExecutionException
异常。 - CallerRunsPolicy:当提交的任务无法被接受执行时,直接在调用者线程中运行该任务。
- DiscardPolicy:当提交的任务无法被接受执行时,直接丢弃该任务,不抛出异常也不进行任何处理。
- DiscardOldestPolicy:当提交的任务无法被接受执行时,丢弃队列中最旧的任务,然后尝试重新提交当前任务。
要设置拒绝策略,需要创建一个ThreadPoolExecutor
实例,并在构造函数中传入相应的策略。以下是一个使用CallerRunsPolicy
拒绝策略的示例:
import java.util.concurrent.*; public class ThreadPoolExample { public static void main(String[] args) { int corePoolSize = 2; int maximumPoolSize = 4; long keepAliveTime = 10L; TimeUnit unit = TimeUnit.SECONDS; BlockingQueueworkQueue = new LinkedBlockingQueue<>(3); // 设置拒绝策略为 CallerRunsPolicy RejectedExecutionHandler rejectionPolicy = new CallerRunsPolicy(); ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor( corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue, rejectionPolicy ); for (int i = 0; i < 10; i++) { int finalI = i; threadPoolExecutor.submit(() -> { System.out.println("Task " + finalI + " is running on thread " + Thread.currentThread().getName()); }); } threadPoolExecutor.shutdown(); } }
在这个示例中,我们创建了一个ThreadPoolExecutor
实例,并设置了CallerRunsPolicy
作为拒绝策略。然后我们提交了10个任务到线程池中,当任务数量超过线程池的处理能力时,将会使用CallerRunsPolicy
策略处理无法被接受的任务。