![](http://images.cnitblog.com/blog/497634/201401/07231601-3ee0f7defe5847289e6e308d1d312ed1.jpg)
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