ThreadPoolExecutor的拒绝策略RejectedExecutionHandler

本文详细介绍了Java中线程池Executor的工作原理,特别是ThreadPoolExecutor的关键参数及拒绝策略。包括CallerRunsPolicy、AbortPolicy等四种内置策略,并展示了如何自定义拒绝策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

[color=darkred][b]并发编程--线程池Executor(一)[/b][/color]
[img]http://images.cnitblog.com/blog/497634/201401/07231601-3ee0f7defe5847289e6e308d1d312ed1.jpg[/img]
[url]http://blog.youkuaiyun.com/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.youkuaiyun.com/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.youkuaiyun.com/lipc_/article/details/52025993[/url]

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

[size=medium][color=red][b]ThreadPoolExecutor线程池参数设置技巧[/b][/color][/size]
[url]https://www.cnblogs.com/waytobestcoder/p/5323130.html[/url]
ThreadPoolExecutor拒绝策略参数是用于处理线程池中任务队列已满,无法继续添加任务时的策略。当线程池中的任务队列已满,且线程池中的线程数已经达到最大线程数时,线程池会采用拒绝策略来处理新的任务。ThreadPoolExecutor提供了四种拒绝策略参数,分别是: 1. AbortPolicy:直接抛出异常,默认策略; 2. CallerRunsPolicy:只用调用者所在线程来运行任务; 3. DiscardOldestPolicy:丢弃队列里最近的一个任务,并执行当前任务; 4. DiscardPolicy:不处理,直接丢弃任务。 自定义拒绝策略需要实现RejectedExecutionHandler接口,并重写rejectedExecution方法,该方法会在任务被拒绝时被调用。在该方法中,可以自定义处理被拒绝的任务,例如重新开启一个线程来执行被拒绝的任务。 示例代码如下: ```java public class CustRejectedExecutionHandler implements RejectedExecutionHandler { @Override public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) { new Thread(r,"线程:"+new Random().nextInt(10)).start(); } } ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor( 1, 2, 10, TimeUnit.MICROSECONDS, new LinkedBlockingDeque<>(2), new CustRejectedExecutionHandler()); ``` 默认的拒绝策略是AbortPolicy,其实现代码如下: ```java 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()); } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值