ThreadPoolExecutor的拒绝策略RejectedExecutionHandler

[color=darkred][b]并发编程--线程池Executor(一)[/b][/color]
[img]http://images.cnitblog.com/blog/497634/201401/07231601-3ee0f7defe5847289e6e308d1d312ed1.jpg[/img]
[url]http://blog.csdn.net/qq924862077/article/details/75305297[/url]

在分析[color=red][b]ThreadPoolExecutor[/b][/color]的构造参数时,有一个RejectedExecutionHandler参数。

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


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

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

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

[size=medium][color=black][b]自定义拒绝策略[/b][/color][/size]
通过看前面的系统提供的四种拒绝策略可以看出,拒绝策略的实现都非常简单。自己写亦一样
比如现在想让被拒绝的任务在一个新的线程中执行,可以这样写:
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());


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

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

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

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

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

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

[size=medium][color=red][b]ThreadPoolExecutor详解[/b][/color][/size]
[url]http://blog.csdn.net/lipc_/article/details/52025993[/url]

[size=medium][color=red][b]Java Executor并发框架(三)ThreadFactory介绍[/b][/color][/size]
[url]http://blog.csdn.net/pfnie/article/details/52756738[/url]

[size=medium][color=red][b]ThreadPoolExecutor线程池参数设置技巧[/b][/color][/size]
[url]https://www.cnblogs.com/waytobestcoder/p/5323130.html[/url]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值