Java线程池的拒绝策略定义了当线程池无法接受新任务时,如何处理新提交的任务。以下是Java线程池提供的几种常见的拒绝策略:
1. AbortPolicy(默认):当线程池无法处理新任务时,直接抛出RejectedExecutionException
异常。
ExecutorService executor = new ThreadPoolExecutor(
corePoolSize, maxPoolSize, keepAliveTime, TimeUnit.SECONDS,
new LinkedBlockingQueue<>(queueSize), Executors.defaultThreadFactory(),
new ThreadPoolExecutor.AbortPolicy());
2. CallerRunsPolicy:当线程池无法处理新任务时,将任务返回给调用者执行,即由提交任务的线程来执行该任务。
ExecutorService executor = new ThreadPoolExecutor(
corePoolSize, maxPoolSize, keepAliveTime, TimeUnit.SECONDS,
new LinkedBlockingQueue<>(queueSize), Executors.defaultThreadFactory(),
new ThreadPoolExecutor.CallerRunsPolicy());
3. DiscardPolicy:当线程池无法处理新任务时,直接丢弃该任务,不做任何处理。
ExecutorService executor = new ThreadPoolExecutor(
corePoolSize, maxPoolSize, keepAliveTime, TimeUnit.SECONDS,
new LinkedBlockingQueue<>(queueSize), Executors.defaultThreadFactory(),
new ThreadPoolExecutor.DiscardPolicy());
4. DiscardOldestPolicy:当线程池无法处理新任务时,先丢弃队列中最旧的任务,然后再尝试提交新任务。
ExecutorService executor = new ThreadPoolExecutor(
corePoolSize, maxPoolSize, keepAliveTime, TimeUnit.SECONDS,
new LinkedBlockingQueue<>(queueSize), Executors.defaultThreadFactory(),
new ThreadPoolExecutor.DiscardOldestPolicy());
以上是Java线程池的几种常见拒绝策略。你可以根据实际需求选择适合的拒绝策略,或者自定义拒绝策略实现RejectedExecutionHandler
接口来处理无法接受的任务。