每一年都奔走在自己热爱里

没有人是一座孤岛,总有谁爱着你

创建线程的拒绝策略

创建线程的拒绝策略

对于ThreadPoolExecutor的构造参数,有一个RejectedExecutionHandler参数,用于配置线程池的拒绝策略。

在当前线程阻塞队列已满,工作线程达到最大时,新的线程请求到来就会调用该接口对过量的任务进行处理。

ThreadPoolExecutor默认有四种拒绝策略:

  • AbortPolicy
  • DiscardPolicy
  • DiscardOldestPolicy
  • CallerRunsPolicy
AbortPolicy

ThreadPoolExecutor中默认的拒绝策略就是AbortPolicy。直接抛出异常。

public static class AbortPolicy implements RejectedExecutionHandler {
    public AbortPolicy() { }
    public void rejectedExecution(Runnable r, ThreadPoolExecutor e) {
        throw new RejectedExecutionException("Task " + r.toString() +
                                             " rejected from " +
                                             e.toString());
    }
}

抛出RejectedExecutionException异常。

DiscardPolicy

啥也不干

public static class DiscardPolicy implements RejectedExecutionHandler {

    public DiscardPolicy() { }

    public void rejectedExecution(Runnable r, ThreadPoolExecutor e) {
    }
}

DiscardOldestPolicy

抛弃任务队列中最旧的任务也就是最先加入队列的,再把这个新任务添加进去


    public static class DiscardOldestPolicy implements RejectedExecutionHandler {
        public DiscardOldestPolicy() { }
        public void rejectedExecution(Runnable r, ThreadPoolExecutor e) {
            if (!e.isShutdown()) {
                e.getQueue().poll();
                e.execute(r);
            }
        }
    }
CallerRunsPolicy

调用当前线程池的所在的线程去执行被拒绝的任务

public static class CallerRunsPolicy implements RejectedExecutionHandler {

    public CallerRunsPolicy() { }
    public void rejectedExecution(Runnable r, ThreadPoolExecutor e) {
        if (!e.isShutdown()) {
            r.run();
        }
    }
}

缺点就是可能会阻塞主线程,或者说是开辟线程池的线程

posted @ 2021-06-16 19:10  雨下整夜~  阅读(136)  评论(0)    收藏  举报