需求:实现线程池满了之后直接报错提示。
定义线程池
private static final ThreadPoolExecutor ThreadPool4HandleBizProcessAsync = new ThreadPoolExecutor(1, 2, 30, TimeUnit.SECONDS,
new ArrayBlockingQueue<>(1), new ThreadPool4BizRequestAsyncRejectedPolicy()) {
@Override
public String toString() {
return "ThreadPool4HandleBizRequestAsync[pool size = %d, pool max size = %d, active threads = %d, queued tasks = %d, completed tasks = %d, is shutdown = %b, is terminated = %b] "
.formatted(getPoolSize(), getMaximumPoolSize(), getActiveCount(), getQueue().size(),getCompletedTaskCount(), isShutdown(), isTerminated());
}
};
定义拒绝策略
import java.util.concurrent.RejectedExecutionException;
import java.util.concurrent.RejectedExecutionHandler;
import java.util.concurrent.ThreadPoolExecutor;
/**
* 用于异步请求业务系统的线程池的拒绝策略
* 当队列满了,将会拒绝新任务
* @author zhout
*/
public class ThreadPool4BizRequestAsyncRejectedPolicy implements RejectedExecutionHandler {
public ThreadPool4BizRequestAsyncRejectedPolicy() {
}
public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {
if (!executor.isShutdown()) {
throw new RejectedExecutionException("线程池及队列已满(处理异步业务信令)。新任务(%s)被(%s)拒绝。".formatted(r.toString(),executor.toString()));
}
}
}