当前位置:网站首页>线程池的拒绝策略
线程池的拒绝策略
2022-07-07 16:37:00 【珠峰下的沙砾】
使用线程池解决了我们手动去创建线程的过程,同时也可以实现线程的复用;大大节省更多资源和时间。
我们可以定制不同的线程池,方便为以后提交任务使用。往往有时候我们设置的线程数量满足不了使用场景时,线程池就会通过一些策略处理超出的任务。下面我们看看线程池是如何解决任务超出。
线程池的拒绝策略父接口
// 拒绝执行处理程序
public interface RejectedExecutionHandler {
// 当提交的任务超出了线程池的处理范围时,,可能由ThreadPoolExecutor调用的方法。
void rejectedExecution(Runnable r, ThreadPoolExecutor executor);
}
AbortPolicy(默认策略)
// 抛出异常RejectedExecutionException
public static class AbortPolicy implements RejectedExecutionHandler {
/** * Creates an {@code AbortPolicy}. */
public AbortPolicy() {
}
// 抛出异常
// xx的任务被xx线程池拒绝
public void rejectedExecution(Runnable r, ThreadPoolExecutor e) {
throw new RejectedExecutionException("Task " + r.toString() +
" rejected from " +
e.toString());
}
}
DiscardPolicy
// 它默默地丢弃被拒绝的任务。
public static class DiscardPolicy implements RejectedExecutionHandler {
/** * Creates a {@code DiscardPolicy}. */
public DiscardPolicy() {
}
// 什么都不做,具有丢弃任务 r 的效果
public void rejectedExecution(Runnable r, ThreadPoolExecutor e) {
}
}
DiscardOldestPolicy
// 丢弃最旧的未处理请求,然后重试execute ,除非执行程序被关闭,在这种情况下任务被丢弃。
public static class DiscardOldestPolicy implements RejectedExecutionHandler {
/** * Creates a {@code DiscardOldestPolicy} for the given executor. */
public DiscardOldestPolicy() {
}
// 获取并忽略 executor 将执行的下一个任务,如果一个任务立即可用,然后重试任务 r 的 执行,除非 executor 被关闭,在这种情况下任务 r 被丢弃
public void rejectedExecution(Runnable r, ThreadPoolExecutor e) {
// 检查线程池是否关闭,
// 没有关闭则进入方法
// 关闭则将任务丢弃
if (!e.isShutdown()) {
// 将阻塞队列在最后一个任务移除
e.getQueue().poll();
// 将新的任务提交放入队列中
e.execute(r);
}
}
}
CallerRunsPolicy
// 直接在execute方法的调用线程中运行被拒绝的任务,除非执行程序已关闭,在这种情况下,任务将被丢弃。
public static class CallerRunsPolicy implements RejectedExecutionHandler {
/** * Creates a {@code CallerRunsPolicy}. */
public CallerRunsPolicy() {
}
// 在调用者的线程中执行任务 r,除非执行者已经关闭,在这种情况下任务被丢弃。
public void rejectedExecution(Runnable r, ThreadPoolExecutor e) {
// 检查线程池是否关闭
// 没有关闭则进入方法
// 反之丢弃任务
if (!e.isShutdown()) {
// 调用run方法执行任务
// 在调用者线程中执行此任务
r.run();
}
}
}
边栏推荐
- 标准ACL与扩展ACL
- 云安全日报220707:思科Expressway系列和网真视频通信服务器发现远程攻击漏洞,需要尽快升级
- 能同时做三个分割任务的模型,性能和效率优于MaskFormer!Meta&UIUC提出通用分割模型,性能优于任务特定模型!开源!...
- nest. Database for getting started with JS
- 财富证券证券怎么开户?通过链接办理股票开户安全吗
- Is it safe to open an online futures account now? How many regular futures companies are there in China?
- Test for 3 months, successful entry "byte", my interview experience summary
- [principles and technologies of network attack and Defense] Chapter 5: denial of service attack
- 性能测试过程和计划
- 元宇宙带来的创意性改变
猜你喜欢
4种常见的缓存模式,你都知道吗?
Disk storage chain B-tree and b+ tree
idea彻底卸载安装及配置笔记
Chapter 2 building CRM project development environment (building development environment)
Chapter 2 build CRM project development environment (database design)
线程池和单例模式以及文件操作
Discuss | what preparations should be made before ar application is launched?
Mobile pixel bird game JS play code
清华、剑桥、UIC联合推出首个中文事实核查数据集:基于证据、涵盖医疗社会等多个领域
数学分析_笔记_第11章:Fourier级数
随机推荐
[paper sharing] where's crypto?
[demo] circular queue and conditional lock realize the communication between goroutines
[trusted computing] Lesson 12: TPM authorization and conversation
备份阿里云实例-oss-browser
[principles and technologies of network attack and Defense] Chapter 5: denial of service attack
Kirk Borne的本周学习资源精选【点击标题直接下载】
Tips for this week 134: make_ Unique and private constructors
ICer知识点杂烩(后附大量题目,持续更新中)
Pro2: modify the color of div block
直播软件搭建,canvas文字加粗
云景网络科技面试题【杭州多测师】【杭州多测师_王sir】
Unlike the relatively short-lived industrial chain of consumer Internet, the industrial chain of industrial Internet is quite long
保证接口数据安全的10种方案
Hash, bitmap and bloom filter for mass data De duplication
debian10编译安装mysql
RIP和OSPF的区别和配置命令
Sanxian Guidong JS game source code
Wireshark分析抓包数据*.cap
行业案例|数字化经营底座助力寿险行业转型
你真的理解粘包与半包吗?3分钟搞懂它