线程池自定义拒绝策略,当线程数量到达最大时,不抛出异常,让其等待下去,直至有线程空闲出来处理;但超过指定时间还未有空余线程就抛出异常
时间: 2023-06-30 16:23:16 浏览: 127
Java 线程池 8 大拒绝策略,面试必问!.docx
当线程池中的线程数量达到最大值时,可以通过自定义拒绝策略来实现让任务等待空闲线程处理的需求。如果超过指定时间还未有空余线程处理,则抛出异常。下面是一个简单的自定义拒绝策略的实现示例:
```java
public class CustomRejectedExecutionHandler implements RejectedExecutionHandler {
private static final int MAX_WAIT_TIME = 5000; // 最大等待时间,单位毫秒
@Override
public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {
long start = System.currentTimeMillis();
try {
while (true) {
if (executor.getQueue().offer(r, MAX_WAIT_TIME, TimeUnit.MILLISECONDS)) {
break;
}
if (System.currentTimeMillis() - start >= MAX_WAIT_TIME) {
throw new RejectedExecutionException("Task " + r.toString() + " rejected from " + executor.toString() + " after timeout");
}
}
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
}
}
```
在这个自定义拒绝策略中,当线程池中的线程数量达到最大值时,将会把任务添加到线程池的阻塞队列中,等待空闲线程处理。如果队列已满,则会等待一段时间,直到队列中有空闲位置。如果等待时间超过了指定的最大等待时间,则抛出 `RejectedExecutionException` 异常。这样可以在保证任务不被丢弃的同时,避免任务长时间等待导致性能问题。
阅读全文