当前位置:网站首页>线程池的拒绝策略
线程池的拒绝策略
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();
}
}
}
边栏推荐
- Introduction to OTA technology of Internet of things
- 低代码助力企业数字化转型会让程序员失业?
- Mui side navigation anchor positioning JS special effect
- [principle and technology of network attack and Defense] Chapter 7: password attack technology Chapter 8: network monitoring technology
- Yearning-SQL审核平台
- Slider plug-in for swiper left and right switching
- 将模型的记忆保存下来!Meta&UC Berkeley提出MeMViT,建模时间支持比现有模型长30倍,计算量仅增加4.5%...
- 元宇宙带来的创意性改变
- Unlike the relatively short-lived industrial chain of consumer Internet, the industrial chain of industrial Internet is quite long
- [trusted computing] Lesson 11: TPM password resource management (III) NV index and PCR
猜你喜欢
回归问题的评价指标和重要知识点总结
上市十天就下线过万台,欧尚Z6产品实力备受点赞
socket编程之常用api介绍与socket、select、poll、epoll高并发服务器模型代码实现
简单几步教你如何看k线图图解
List selection JS effect with animation
Sanxian Guidong JS game source code
The highest level of anonymity in C language
Year SQL audit platform
How to clean when win11 C disk is full? Win11 method of cleaning C disk
[paddleseg source code reading] add boundary IOU calculation in paddleseg validation (1) -- val.py file details tips
随机推荐
Chapter 3 business function development (to remember account and password)
[paper sharing] where's crypto?
[trusted computing] Lesson 13: TPM extended authorization and key management
Introduction to OTA technology of Internet of things
海量数据去重的hash,bitmap与布隆过滤器Bloom Filter
Chapter 1 Introduction to CRM core business
【剑指 Offer】59 - I. 滑动窗口的最大值
SD_DATA_SEND_SHIFT_REGISTER
Five simple ways to troubleshoot with Stace
持续测试(CT)实战经验分享
元宇宙带来的创意性改变
Using stored procedures, timers, triggers to solve data analysis problems
Kirk Borne的本周学习资源精选【点击标题直接下载】
手撕Nacos源码(先撕客户端源码)
Disk storage chain B-tree and b+ tree
< code random recording two brushes> linked list
Test for 3 months, successful entry "byte", my interview experience summary
【demo】循环队列及条件锁实现goroutine间的通信
小程序中实现付款功能
Tips for short-term operation of spot silver that cannot be ignored