ThreadPoolExecutor的拒绝策略RejectedExecutionHandler

并发编程--线程池Executor(一)

http://blog.csdn.net/qq924862077/article/details/75305297

在分析 ThreadPoolExecutor的构造参数时,有一个RejectedExecutionHandler参数。

RejectedExecutionHandler是一个接口:
public interface RejectedExecutionHandler {
    void rejectedExecution(Runnable r, ThreadPoolExecutor executor);
}


里面只有一个方法。当要创建的线程数量大于线程池的最大线程数的时候,新的任务就会被拒绝,就会调用这个接口里的这个方法。

可以自己实现这个接口,实现对这些超出数量的任务的处理。

ThreadPoolExecutor自己已经提供了四个拒绝策略,分别是 CallerRunsPolicy,AbortPolicy,DiscardPolicy,DiscardOldestPolicy
这四个拒绝策略其实一看实现方法就知道很简单

自定义拒绝策略
通过看前面的系统提供的四种拒绝策略可以看出,拒绝策略的实现都非常简单。自己写亦一样
比如现在想让被拒绝的任务在一个新的线程中执行,可以这样写:
static class MyRejectedExecutionHandler implements RejectedExecutionHandler {
    @Override
    public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {
        new Thread(r,"新线程"+new Random().nextInt(10)).start();
    }
}

然后正常使用:
ThreadPoolExecutor executor = new ThreadPoolExecutor(1, 2, 30,
        TimeUnit.SECONDS,
        new LinkedBlockingDeque<Runnable>(2),
        new MyRejectedExecutionHandler());


参考: http://blog.csdn.net/qq_25806863/article/details/71172823

java多线程 ThreadPoolExecutor 策略的坑
无论是使用jdk的线程池ThreadPoolExecutor 还是spring的线程池ThreadPoolTaskExecutor 都会使用到一个阻塞队列来进行存储线程任务。

   当线程不够用时,则将后续的任务暂存到 阻塞队列中,等待有空闲线程来进行。

  当这个阻塞队列满了的时候,会出现两种情况

   正在运行的线程数量小于 maximumPoolSize,那么还是要创建线程运行这个任务;

   正在运行的线程数量大于或等于 maximumPoolSize,那么线程池会通过一个策略进行对后续的任务进行处理。
参考: https://www.cnblogs.com/lic309/p/4564507.html

ThreadPoolExecutor详解
http://blog.csdn.net/lipc_/article/details/52025993

Java Executor并发框架(三)ThreadFactory介绍
http://blog.csdn.net/pfnie/article/details/52756738

ThreadPoolExecutor线程池参数设置技巧
https://www.cnblogs.com/waytobestcoder/p/5323130.html

猜你喜欢

转载自rd-030.iteye.com/blog/2409855