要自定义一个拒绝策略,你可以实现 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。当队列满了之后,会调用 CustomRejectedExecutionHandlerrejectedExecution 方法,将任务放入队列中,阻塞主线程等待队列空闲。

注意,在实际使用中,你可能需要根据具体需求来调整线程池的参数和队列大小。另外,executor.shutdown() 方法用于优雅地关闭线程池

Java线程池自定义一个拒绝策略我希望队列满了以后阻塞主线程

原文地址: https://www.cveoy.top/t/topic/h0xx 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录