1、当一个有限队列充满后,线程池的饱和策略开始起作用。
2、ThreadPoolExecutor的饱和策略通过调用setRejectedExecutionHandler来修改。不同的饱和策略如下:
1)AbortPolicy:中止,executor抛出未检查RejectedExecutionException,调用者捕获这个异常,然后自己编写能满足自己需求的处理代码。
2)DiscardRunsPolicy:遗弃最旧的,选择丢弃的任务,是本应接下来就执行的任务。
3)DiscardPolicy:遗弃会默认放弃最新提交的任务(这个任务不能进入队列等待执行时)
4)CallerRunsPolicy:调用者运行,既不会丢弃哪个任务,也不会抛出任何异常,把一些任务推回到调用者那里,以此减缓新任务流。它不会在池线程中执行最新提交的任务,但它会在一个调用了execute的线程中执行。
3、创建一个可变长的线程池,使用受限队列和调用者运行饱和策略。
ThreadPoolExecutor executor=newThreadPoolExecutor(N_THREADS,N_THREADS,0L,TimeUnit.MILLISECONDS,newLinkedBlockingQueue<Runnable>(CAPACITY));
executor.setRejectedExecutionHandler(newThreadPoolExecutor.CallerRunsPolicy());
4、当线程队列充满后,并没有预置的饱和策略来阻塞execute。但是,使用Semaphore信号量可以实现这个效果。Semaphore会限制任务注入率。
@ThreadSafe
public class BoundedExecutor{
private final Executorexec;
private final Semaphoresemaphore;
publicBoundedExecutor(Executor exec,int bound){
this.exec=exec;
this.semaphore=new Semaphore(bound);
}
public voidsubmitTask(final Runnable command) throwsInterruptedException{
semaphore.acquire();
try{
exec.execute(new Runnable(){
public void run(){
try{
command.run();
}
finally{
semaphore.release();
}
}
});
}catch (RejectedExecutionException e){
semaphore.release();
}
}
}
分享到:
相关推荐
并发-线程池和阻塞队列 并发-线程池和阻塞队列 并发-线程池和阻塞队列
主要介绍了java线程池工作队列饱和策略代码示例,涉及线程池的简单介绍,工作队列饱和策略的分析及代码示例,具有一定参考价值,需要的朋友可以了解下。
11-线程池 ThreadPoolExecutor 底层原理源码分析(上)-...15、CPU缓存架构详解&高性能内存队列Disruptor 实战 (1).pdf 16、常用并发设计模式精讲 (1).pdf designpattern.zip disruptor.zip forkjoin.zip jmm(1).zip
11-线程池 ThreadPoolExecutor 底层原理源码分析(上)-...15、CPU缓存架构详解&高性能内存队列Disruptor 实战 (1).pdf 16、常用并发设计模式精讲 (1).pdf designpattern.zip disruptor.zip forkjoin.zip jmm(1).zip
讲述线程池原理,线程池使用场景和注意事项,手动创建线程池方法,注意事项,阻塞队列的相关知识
线程是系统中可执行调度的...线程池不允许使用 Executors 去创建,而是通过 ThreadPoolExecutor 的方式,规避资源耗尽的风险。集合的详细描述,以及集合中的异同点,HashMap不同jdk版本区别,ConcurrentHashMap介绍。
java-消息队列Rabbit各种模式测试用例 适用于个人学习Rabbit消息队列!
NULL 博文链接:https://j2ee2009.iteye.com/blog/689161
07-Redis队列Stream、Redis多线程详解_ev.07-Redis队列Stream、Redis多线程详解_ev.07-Redis队列Stream、Redis多线程详解_ev.07-Redis队列Stream、Redis多线程详解_ev.07-Redis队列Stream、Redis多线程详解_ev.07-...
计算机后端-Java-Java高并发从入门到面试教程-息队列思路.zip
数据结构-实验4-循环队列的实现和运算.docx数据结构-实验4-循环队列的实现和运算.docx数据结构-实验4-循环队列的实现和运算.docx数据结构-实验4-循环队列的实现和运算.docx数据结构-实验4-循环队列的实现和运算.docx...
aws-java-sdk-1.2.12里是使用亚马逊云端服务端的sdk包 里面有几个例子,将其添加到新建的java项目中可以了解其内部实现原理 例子囊括了aws的各种存储,文件,db,队列,等等
058-消息队列高手课058-消息队列高手课058-消息队列高手课
Java-25_通用设计_分布式事务_消息队列.rar
Android中的线程池与任务队列
线程池各类区别使用场景, 工作久了才知道理论的重要性。
链表的应用---队列的实现**插入在链尾,删除在链头 数据结构--队列的实现(链队)--带头节点
php队列+php-redis队列+php-redis扩展,php入队出队,redis入队出队以及其php .dll扩展
Java-用数组实现栈-队列-线性列表(最详细) 有注释 适合java新生 进行数组的练习 3个数据结构的数组实现练习
pptx文件,26页,杭州机场-智慧队列管理-AXIS智能解决方案,精品一级