ThreadPoolExecutor.DiscardOldestPolicy()
时间: 2023-11-02 11:33:16 浏览: 119
`ThreadPoolExecutor.DiscardOldestPolicy()` 是Java中线程池的一个饱和策略,用于处理当线程池的任务队列已满,无法再添加新任务时的情况。
`DiscardOldestPolicy()` 的作用是,当任务队列已满时,丢弃队列中最早的任务,然后尝试将新任务添加到队列中。这样做的好处是可以保证新的任务能够尽快地被执行,但是可能会导致一些早期的任务被丢弃而没有被执行。
需要注意的是,使用 `DiscardOldestPolicy()` 策略时,如果线程池中所有线程都处于忙碌状态,新任务将无法得到执行,因为队列中的最早任务被丢弃了。因此,需要根据任务的重要程度和执行顺序的要求来选择适当的饱和策略。
相关问题
ThreadPoolExecutor.DiscardOldestPolicy
`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`拒绝策略,会丢弃队列中最早的一个任务。
注意,在实际使用时,需要根据具体需求选择适合的拒绝策略来处理任务队列已满的情况。
8核32G的配置怎么设置线程池比较合理ExecutorService newCacheThreadPool = new ThreadPoolExecutor( 10, 100, 3, TimeUnit.SECONDS, new LinkedBlockingDeque<>(1000), Executors.defaultThreadFactory(), new ThreadPoolExecutor.DiscardOldestPolicy() );
针对8核32G的配置,推荐的线程池参数如下:
1. corePoolSize:根据CPU核数设置,一般设置为CPU核数的2倍,即16。
2. maximumPoolSize:根据实际情况设置,一般不超过CPU核数的4倍,即32。
3. keepAliveTime:根据实际情况设置,一般不宜过长,例如10秒。
4. unit:时间单位,一般设置为TimeUnit.SECONDS。
5. workQueue:阻塞队列,可以根据实际情况选择适合的队列类型,例如LinkedBlockingDeque。
6. threadFactory:线程工厂,可以使用默认的线程工厂,即Executors.defaultThreadFactory()。
7. handler:拒绝策略,当线程池和队列都满了之后,可以采用DiscardOldestPolicy策略,丢弃最老的任务。
根据上述参数,可以创建如下的线程池:
```
ExecutorService threadPool = new ThreadPoolExecutor(
16,
32,
10,
TimeUnit.SECONDS,
new LinkedBlockingDeque<>(1000),
Executors.defaultThreadFactory(),
new ThreadPoolExecutor.DiscardOldestPolicy()
);
```
需要注意的是,以上参数仅供参考,具体的参数设置需要根据实际情况进行调整。
阅读全文