Java 线程池的拒绝策略主要有以下几种:
-
AbortPolicy(默认):
- 抛出一个 RejectedExecutionException 异常,阻止系统继续执行新任务。
- 这是默认的拒绝策略,如果不显式地指定拒绝策略,线程池会使用 AbortPolicy。
-
CallerRunsPolicy:
- 当线程池无法处理新任务时,将任务返回给提交任务的线程执行。
- 这样可以保证任务不会丢失,但可能会影响提交任务的线程的性能。
-
DiscardPolicy:
- 直接丢弃无法处理的任务,不做任何处理。
- 丢弃的任务不会被执行,也不会抛出异常。
-
DiscardOldestPolicy:
- 丢弃等待队列中最早的任务,并尝试重新提交当前任务。
- 这样可以尽量保留新提交的任务,但可能会导致一些等待执行的任务被丢弃。
这些拒绝策略可以在创建线程池时通过 ThreadPoolExecutor
的构造函数来指定,或者通过 setRejectedExecutionHandler()
方法进行设置。
例如,如果要指定线程池使用 CallerRunsPolicy 拒绝策略,可以这样设置:
ThreadPoolExecutor executor = new ThreadPoolExecutor(corePoolSize, maximumPoolSize, keepAliveTime, TimeUnit.SECONDS, workQueue);
executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
需要根据实际的业务需求和系统特点来选择合适的拒绝策略,以保证系统的稳定性和性能。