ThreadPoolExecutor中的RejectedExecutionHandler浅析
来源:互联网 发布:mix软件 编辑:程序博客网 时间:2024/06/05 16:08
当ThreadPoolExecutor中的线程都已经忙于执行,且有界队列也满了,这个时候就需要自己写reject策略;此处给一个demo,供大家去理解和参考:
1、先写一个可执行的线程
package zhengchao_001_005.ThreadPoolExecutor;public class Task implements Runnable{private int id ;private String name ;public Task(int id, String name){this.id = id;this.name = name;}public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}@Overridepublic void run() {//System.out.println("当前线程id和名称为:" + this.id +", " + this.name);try {Thread.sleep(5*1000);} catch (Exception e) {e.printStackTrace();}}public String toString(){return "{ id : " + this.id + ", name : " + this.name + "}";}}
2、我们写一个RejectedExecutionHandler,必须要实现RejectedExecutionHandler接口,并实现他的rejectedExecution()方法
两个参数,一个是需要拒绝的线程,另一个是我们的线程池,至于如何拒绝,按照自己的业务逻辑去进行处理,
package zhengchao_001_005.ThreadPoolExecutor;import java.util.concurrent.RejectedExecutionHandler;import java.util.concurrent.ThreadPoolExecutor;public class MyRejected implements RejectedExecutionHandler{@Overridepublic void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {System.out.println("自定义拒绝处理_"+r.toString());}}
3、测试用例
package zhengchao_001_005.ThreadPoolExecutor;import java.util.concurrent.ArrayBlockingQueue;import java.util.concurrent.ThreadPoolExecutor;import java.util.concurrent.TimeUnit;public class TestThreadPoolExecutor {public static void main(String[] args) {ThreadPoolExecutor pool = new ThreadPoolExecutor(1, //核心的线程数量1, //最大的线程数量10, //空闲数值 TimeUnit.SECONDS, //空闲时间单位new ArrayBlockingQueue<Runnable>(3),//有界队列new MyRejected()); Task t1 = new Task(1, "任务" + 1);Task t2 = new Task(2, "任务" + 2);Task t3 = new Task(3, "任务" + 3);Task t4 = new Task(4, "任务" + 4);Task t5 = new Task(5, "任务" + 5);pool.execute(t1);pool.execute(t2);pool.execute(t3);pool.execute(t4);pool.execute(t5);try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}//System.out.println(pool.getQueue().size());try {Thread.sleep(6000);} catch (InterruptedException e) {e.printStackTrace();}}}
运行结果:
自定义拒绝处理_{ id : 5, name : 任务5}当前线程id和名称为:1, 任务1当前线程id和名称为:2, 任务2当前线程id和名称为:3, 任务3当前线程id和名称为:4, 任务4
注意点:
如果使用LinkedBlockingQueue则不会有队列满的问题,LinkedBlockingQueue直到系统资源耗尽才会出问题,但这种体验可能会比较差,至于用哪种好,仁者见仁,不是,业务为前提。
阅读全文
1 0
- ThreadPoolExecutor中的RejectedExecutionHandler浅析
- Java 之ThreadPoolExecutor.RejectedExecutionHandler
- 关于ThreadPoolExecutor 调用RejectedExecutionHandler的机制
- 线程池.(Executors,ThreadPoolExecutor,BlockingQueue,RejectedExecutionHandler).介绍
- java多线程-ThreadPoolExecutor的拒绝策略RejectedExecutionHandler
- RejectedExecutionHandler
- RejectedExecutionHandler
- 浅析ThreadPoolExecutor
- 浅析ThreadPoolExecutor
- Java线程(八):ThreadPoolExecutor、RejectedExecutionHandler
- Android线程池(二)——ThreadPoolExecutor及其拒绝策略RejectedExecutionHandler使用示例
- ThreadPoolExecutor自定义RejectedExecutionHandler当队列满时改为调用BlockingQueue. put来实现生产者的阻塞
- 浅析ThreadPoolExecutor的执行过程
- Java线程中的ThreadPoolExecutor
- Java中的ThreadPoolExecutor类
- Java中的ThreadPoolExecutor
- Java中的ThreadPoolExecutor类
- Java线程池类ThreadPoolExecutor浅析
- oracle数据库sql语句05
- 数据结构之 单链表 模板类
- Azkaban实战案例
- Gerrit (Mac)
- Rust :fold
- ThreadPoolExecutor中的RejectedExecutionHandler浅析
- python学习笔记(六)——错误和异常处理
- 10月26日
- AUTOCAD学习笔记6:单相桥式整流电路的绘制
- 10.26JAVA学习
- 文件、图片的上传(一)-----前端与后端代码
- 直接用Socket TCP开发网络游戏(一)
- python dlib学习(三):调用cnn人脸检测
- 训练总结