ThreadPoolExecutor.DiscardOldestPolicy
时间: 2023-08-12 13:09:38 浏览: 92
`ThreadPoolExecutor.DiscardOldestPolicy`是Java中`ThreadPoolExecutor`类提供的一个拒绝策略,用于处理当线程池的任务队列已满,并且无法继续接受新的任务时发生的情况。
当线程池的任务队列已满时,`ThreadPoolExecutor.DiscardOldestPolicy`会丢弃队列中最早的一个任务,并尝试将当前任务加入到队列中。这意味着新提交的任务会替换掉最早提交的任务,从而保持队列中的任务总数不变。
这个拒绝策略的实现类是`ThreadPoolExecutor.DiscardOldestPolicy`,它是`RejectedExecutionHandler`接口的实现类。该接口定义了一个方法`rejectedExecution`,用于处理拒绝执行的任务。
以下是一个示例代码,演示了如何使用`ThreadPoolExecutor.DiscardOldestPolicy`:
```java
import java.util.concurrent.*;
public class ThreadPoolExample {
public static void main(String[] args) {
// 创建一个线程池
ThreadPoolExecutor executor = new ThreadPoolExecutor(
1, // 核心线程数
1, // 最大线程数
0, TimeUnit.SECONDS, // 线程空闲时间
new ArrayBlockingQueue<>(1), // 任务队列
new ThreadPoolExecutor.DiscardOldestPolicy() // 拒绝策略
);
// 提交任务
for (int i = 1; i <= 5; i++) {
final int taskId = i;
executor.submit(() -> {
System.out.println("Task #" + taskId + " is running.");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Task #" + taskId + " is completed.");
});
}
// 关闭线程池
executor.shutdown();
}
}
```
在上述示例中,我们创建了一个核心线程数为1、最大线程数为1的线程池,任务队列的容量为1。当提交的任务超过队列容量时,使用`ThreadPoolExecutor.DiscardOldestPolicy`拒绝策略,会丢弃队列中最早的一个任务。
注意,在实际使用时,需要根据具体需求选择适合的拒绝策略来处理任务队列已满的情况。
阅读全文