Java线程池自定义一个拒绝策略我希望队列满了以后阻塞主线程
要自定义一个拒绝策略,你可以实现 RejectedExecutionHandler 接口,并重写 rejectedExecution 方法。在 rejectedExecution 方法中,你可以选择不同的处理方式,例如抛出异常、丢弃任务或者阻塞主线程等。
以下是一个示例代码,演示如何自定义一个拒绝策略,当线程池队列满了之后,阻塞主线程等待队列空闲:
import java.util.concurrent.*;
public class CustomRejectedExecutionHandler implements RejectedExecutionHandler {
@Override
public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {
try {
// 队列满了,阻塞主线程等待队列空闲
executor.getQueue().put(r);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
}
public static void main(String[] args) {
// 创建线程池
ThreadPoolExecutor executor = new ThreadPoolExecutor(5, 10, 1, TimeUnit.MINUTES,
new ArrayBlockingQueue<>(5),
new CustomRejectedExecutionHandler());
// 提交任务到线程池
for (int i = 0; i < 20; i++) {
final int taskId = i;
executor.execute(() -> {
System.out.println("Task " + taskId + " is running on thread " + Thread.currentThread().getName());
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
});
}
// 关闭线程池
executor.shutdown();
}
}
在上面的示例中,我们创建了一个线程池 ThreadPoolExecutor,设置核心线程数为5,最大线程数为10,队列大小为5。当队列满了之后,会调用 CustomRejectedExecutionHandler 的 rejectedExecution 方法,将任务放入队列中,阻塞主线程等待队列空闲。
注意,在实际使用中,你可能需要根据具体需求来调整线程池的参数和队列大小。另外,executor.shutdown() 方法用于优雅地关闭线程池
原文地址: https://www.cveoy.top/t/topic/h0xx 著作权归作者所有。请勿转载和采集!