线程池自定义拒绝策略,当线程满时,不抛出异常,让其等待下去,直至有线程空闲出来处理
时间: 2023-06-30 13:23:16 浏览: 142
当线程池中的线程数量达到最大值时,可以通过自定义拒绝策略来实现让任务等待空闲线程处理的需求。下面是一个简单的自定义拒绝策略的实现示例:
```java
public class CustomRejectedExecutionHandler implements RejectedExecutionHandler {
@Override
public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {
try {
// 等待一段时间再尝试添加任务到线程池
executor.getQueue().put(r);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
}
}
```
在这个自定义拒绝策略中,当线程池中的线程数量达到最大值时,将会把任务添加到线程池的阻塞队列中,等待空闲线程处理。如果队列已满,再次添加任务将会阻塞,直到队列中有空闲位置。这样可以保证任务不会被丢弃,也不会抛出异常。
相关问题
线程池自定义拒绝策略,当线程数量到达最大时,不抛出异常,让其等待下去,直至有线程空闲出来处理;但超过指定时间还未有空余线程就抛出异常
当线程池中的线程数量达到最大值时,可以通过自定义拒绝策略来实现让任务等待空闲线程处理的需求。如果超过指定时间还未有空余线程处理,则抛出异常。下面是一个简单的自定义拒绝策略的实现示例:
```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` 异常。这样可以在保证任务不被丢弃的同时,避免任务长时间等待导致性能问题。
线程池自定义拒绝策略
线程池的拒绝策略决定了当线程池无法执行新的任务时如何处理这些任务。Java中的线程池使用RejectedExecutionHandler接口来定义拒绝策略。下面是一个自定义拒绝策略的示例:
```java
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.RejectedExecutionHandler;
import java.util.concurrent.TimeUnit;
public class CustomRejectedExecutionHandler implements RejectedExecutionHandler {
@Override
public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {
// 自定义处理被拒绝的任务逻辑
System.out.println("Task rejected: " + r.toString());
// 可以根据实际需求进行不同的处理,例如记录日志、抛出异常等
}
}
// 在创建线程池时设置自定义的拒绝策略
ThreadPoolExecutor executor = new ThreadPoolExecutor(
corePoolSize, // 核心线程数
maximumPoolSize, // 最大线程数
keepAliveTime, // 非核心线程的空闲时间
TimeUnit.MILLISECONDS, // 空闲时间单位
new LinkedBlockingQueue<Runnable>(), // 任务队列
new CustomRejectedExecutionHandler() // 自定义拒绝策略
);
```
在自定义的`rejectedExecution`方法中,你可以根据需要对被拒绝的任务进行不同的处理,例如记录日志、抛出异常等。
阅读全文