线程池的拒绝策略有哪些?
1 个回答
世界上没有快乐的地方,只有快乐的人。李寒衣### 线程池的拒绝策略 线程池的拒绝策略主要有以下四种: 1. **AbortPolicy** - **描述**:直接丢弃任务,抛出 `RejectedExecutionException` 异常。这是默认的拒绝策略。 - **使用场景**:适用于对任务的处理有严格要求,不能丢失任何任务,并且需要调用方立即感知到任务提交失败的场景。例如,关键的在线交易系统,不允许丢失任何交易请求。 - **示例代码**: ```java RejectedExecutionHandler handler = new ThreadPoolExecutor.AbortPolicy(); ``` 2. **CallerRunsPolicy** - **描述**:由调用线程处理该任务。即提交任务的线程会自己执行这个任务。 - **使用场景**:适用于允许任务降级处理的场景。这样可以缓解线程池的压力,避免任务丢失。例如,日志系统在高负载下可以由主线程自己记录日志,而不是丢弃日志记录。 - **示例代码**: ```java RejectedExecutionHandler handler = new ThreadPoolExecutor.CallerRunsPolicy(); ``` 3. **DiscardOldestPolicy** - **描述**:丢弃阻塞队列中最旧的未处理任务,然后尝试重新提交当前任务。 - **使用场景**:适用于希望丢弃旧任务,以确保新任务能够及时处理的场景。例如,实时数据处理系统,希望处理最新的数据,而不关心旧数据。 - **示例代码**: ```java RejectedExecutionHandler handler = new ThreadPoolExecutor.DiscardOldestPolicy(); ``` 4. **DiscardPolicy** - **描述**:直接丢弃任务,不抛出异常,也不处理。 - **使用场景**:适用于可以容忍任务丢失的场景,系统负载高时可以丢弃部分任务以保证系统稳定。例如,视频流媒体服务器在高负载时可以丢弃部分帧数据,确保视频流的流畅性。 - **示例代码**: ```java RejectedExecutionHandler handler = new ThreadPoolExecutor.DiscardPolicy(); ``` ### 示例代码整合 以下示例展示了如何创建带有不同拒绝策略的线程池: ```java import java.util.concurrent.*; public class ThreadPoolExample { public static void main(String[] args) { int corePoolSize = 5; int maximumPoolSize = 10; long keepAliveTime = 60L; TimeUnit unit = TimeUnit.SECONDS; BlockingQueue<Runnable> workQueue = new LinkedBlockingQueue<>(100); // 创建带有AbortPolicy的线程池 ThreadPoolExecutor abortPolicyExecutor = new ThreadPoolExecutor( corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue, new ThreadPoolExecutor.AbortPolicy() ); // 创建带有CallerRunsPolicy的线程池 ThreadPoolExecutor callerRunsPolicyExecutor = new ThreadPoolExecutor( corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue, new ThreadPoolExecutor.CallerRunsPolicy() ); // 创建带有DiscardOldestPolicy的线程池 ThreadPoolExecutor discardOldestPolicyExecutor = new ThreadPoolExecutor( corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue, new ThreadPoolExecutor.DiscardOldestPolicy() ); // 创建带有DiscardPolicy的线程池 ThreadPoolExecutor discardPolicyExecutor = new ThreadPoolExecutor( corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue, new ThreadPoolExecutor.DiscardPolicy() ); // 示例:提交任务并演示拒绝策略 Runnable task = () -> { System.out.println(Thread.currentThread().getName() + " is executing task."); try { Thread.sleep(2000); // Simulate work } catch (InterruptedException e) { Thread.currentThread().interrupt(); } }; // 提交任务以测试不同的拒绝策略 for (int i = 0; i < 20; i++) { abortPolicyExecutor.execute(task); callerRunsPolicyExecutor.execute(task); discardOldestPolicyExecutor.execute(task); discardPolicyExecutor.execute(task); } abortPolicyExecutor.shutdown(); callerRunsPolicyExecutor.shutdown(); discardOldestPolicyExecutor.shutdown(); discardPolicyExecutor.shutdown(); } } ``` ### 总结 1. **AbortPolicy**:用于关键任务,不能丢失任何任务。 2. **CallerRunsPolicy**:允许任务降级处理,适用于高负载时的应急处理。 3. **DiscardOldestPolicy**:确保新任务能及时处理,适用于实时性要求高的系统。 4. **DiscardPolicy**:可容忍任务丢失,适用于负载高时丢弃部分任务以保证系统稳定。发布于 2024-07-23 23:12 •IP属地 浙江举报评论收藏
公众号进入网站体验更佳

