当前位置:首页 > 经验 >

线程池的拒绝策略(线程池拒绝策略有哪些)

来源:原点资讯(www.yd166.com)时间:2022-11-03 06:05:44作者:YD166手机阅读>>

jdk1.5版本新增了 JUC 并发包,其中一个包含线程池。

四种拒绝策略:

拒绝策略类型

说明

1

ThreadPoolExecutor.AbortPolicy

默认拒绝策略,拒绝任务并抛出任务

2

ThreadPoolExecutor.CallerRunsPolicy

使用调用线程直接运行任务

3

ThreadPoolExecutor.DiscardPolicy

直接拒绝任务,不出现错误

4

ThreadPoolExecutor.DiscardOldestPolicy

触发拒绝策略,只要还有任务新增,一直会丢弃阻塞队列的最老的任务,并将新的任务加入

预先配置配置线程池。
  • 核心线程和最大线程都尽量设置的小一点,分别设置成 1 和 2
  • 阻塞队列设置 固定长度 的有界队列,长度为 1
  • 线程工厂设置 默认线程工厂

// 核心线程数 int corePoolSize = 1; // 最大线程数 int maximumPoolSize = 2; // 线程存活时间 long keepAliveTime = 10; // 线程存活时间单位 TimeUnit unit = TimeUnit.SECONDS; // 有界队列 遵循 FIFO 原则 BlockingQueue<Runnable> workQueue = new ArrayBlockingQueue<>(1); // 线程工厂 ThreadFactory threadFactory = Executors.defaultThreadFactory();创建线程任务

创建线程任务,一个线程任务执行一秒:

class TaskThread implements Runnable{ private int i; public TaskThread(int i) { this.i = i; } @Override public void run() { try { TimeUnit.SECONDS.sleep(2); System.out.println("执行任务:" i); } catch (InterruptedException e) { e.printStackTrace(); } } }拒绝策略一:AbortPolicy

默认拒绝策略,拒绝任务并抛出任务

// 拒绝策略 默认拒绝策略,拒绝任务并抛出异常: RejectedExecutionHandler handler = new ThreadPoolExecutor.AbortPolicy(); ThreadPoolExecutor threadPool = new ThreadPoolExecutor(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue, threadFactory, handler); for (int i = 1; i <= 5; i ) { try { threadPool.execute(new TaskThread(i)); } catch (Exception e) { System.out.println("【任务" i "】报错:" e.getMessage()); } }

输出

【任务】4报错:Task com.test.controller.ThreadPoolController$TaskThread@5c0369c4 rejected from java.util.concurrent.ThreadPoolExecutor@50675690[Running, pool size = 2, active threads = 2, queued tasks = 1, completed tasks = 0] 【任务】5报错:Task com.test.controller.ThreadPoolController$TaskThread@31b7dea0 rejected from java.util.concurrent.ThreadPoolExecutor@50675690[Running, pool size = 2, active threads = 2, queued tasks = 1, completed tasks = 0] 执行任务:1 执行任务:3 执行任务:2

最大线程数 阻塞队列 = 3,执行到4,5的时候就抛出错误。这里需要用 try catch 捕获异常。任务1、2、3正常执行。

如果提交的任务都要执行,可以将抛出的错误任务存入在redis中,然后定时从 redis 获取任务,再提交执行。

拒绝策略二:CallerRunsPolicy

调用线程运行多余的任务。

更换拒绝策略,将上面的 AbortPolicy 换成 CallerRunsPolicy 。

RejectedExecutionHandler handler = new ThreadPoolExecutor.CallerRunsPolicy();

执行任务,输出:

执行任务:1 执行任务:4 执行任务:3 执行任务:2 执行任务:5

最大线程数 阻塞队列 = 3,多余的任务还是继续被执行。

拒绝策略三:DiscardPolicy

拒绝任务,不会出错误。

更换策略,将 CallerRunsPolicy 换成 DiscardPolicy :

RejectedExecutionHandler handler = new ThreadPoolExecutor.DiscardPolicy();

执行任务,输出:

执行任务:1 执行任务:3 执行任务:2

多余的线程任务提交被拒绝,而只执行 最大线程数 阻塞队列 数量的任务,并且不会抛出错误。

拒绝策略四:DiscardOldestPolicy

只要还有任务新增,一直会丢弃 阻塞队列 的最老的任务,并将新的任务加入到 阻塞队列中

更换策略,将 DiscardPolicy 换成 DiscardOldestPolicy :

RejectedExecutionHandler handler3 = new ThreadPoolExecutor.DiscardOldestPolicy();

执行任务,输出:

执行任务:3 执行任务:1 执行任务:5

任务的执行顺序是什么 核心线程数 —> 阻塞队列 —> 最大线程数,其中任务1,任务3提交成功。

  • 任务2因为在阻塞队列中,
  • 后面的任务4把任务2挤掉,
  • 任务5又把任务4挤掉,所以最后执行的是任务5。
总结

本文介绍了线程四种拒绝策略,当工作任务大于 最大线程 阻塞队列 会执行阻塞队列。

  • AbortPolicy 默认策略,拒绝任务,并抛出异常
  • CallerRunsPolicy 调用线程执行对于的任务
  • DiscardPolicy 拒绝任务,不会抛出异常
  • DiscardOldestPolicy 有多余的任务,把阻塞队列最老的任务丢弃,放入新的任务,直到没有新的任务。
    如果觉得文章对你有帮助的话,请点个推荐吧!

栏目热文

线程池内部结构和实现原理(线程池的底层原理和实现方法)

线程池内部结构和实现原理(线程池的底层原理和实现方法)

线程池的基本结构线程池的基本结构,如下图所示。用户通过使用线程池的execute方法将Runnable提交到线程池中进行...

2022-11-03 05:39:37查看全文 >>

java线程池工作原理(mycat和sharding优缺点)

java线程池工作原理(mycat和sharding优缺点)

关注公众号领资料搜索公众号【Java耕耘者】,回复【Java】,即可获取大量优质电子书和一份Java高级架构资料、Spr...

2022-11-03 05:30:30查看全文 >>

线程池底层原理(线程池设计原理图解)

线程池底层原理(线程池设计原理图解)

java的线程池说白了就是建一个任务池子跟一个线程池子,当任务池子里的任务过来了就由线程池里的活跃线程去消费,等任务池子...

2022-11-03 05:58:11查看全文 >>

线程池工作原理图解(线程池的结构和原理)

线程池工作原理图解(线程池的结构和原理)

前言本文以程序员做需求的例子,比喻线程池的工作过程。以故事白话的方式展开,跟大家阐述线程池工作原理,以方便大家更好理解线...

2022-11-03 05:52:26查看全文 >>

线程池原理和实例(线程池的结构和原理)

线程池原理和实例(线程池的结构和原理)

前言线程是稀缺资源,如果被无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,合理的使用线程池对线程进行统一分配、调...

2022-11-03 06:03:39查看全文 >>

线程池满了不丢弃任务(线程池队列满了如何处理)

线程池满了不丢弃任务(线程池队列满了如何处理)

public static ExecutorService newFixedThreadPool(int nThread...

2022-11-03 05:49:52查看全文 >>

自制小麻薯手帐胶带(小麻薯手帐胶带五元100个)

自制小麻薯手帐胶带(小麻薯手帐胶带五元100个)

{"rich_content":{"text":"","spans":null},"video":{"vid":"v02...

2022-11-03 05:52:54查看全文 >>

自己制作手帐胶带的方法(如何自制手帐胶带美观又简单)

自己制作手帐胶带的方法(如何自制手帐胶带美观又简单)

相信大多数人和我一样,最初入坑手帐,都是从胶带开始“沦陷”的。但是一旦你开始囤胶带,必然会“选择困难”,和纸、PET、水...

2022-11-03 05:44:37查看全文 >>

自制十二星座手帐胶带(十二星座闺蜜手帐)

自制十二星座手帐胶带(十二星座闺蜜手帐)

星座本来是一群群恒星的组合,却也与人有着密不可分的联系。常常会有人问你:“你是什么星座”?甚至很多小仙女都用星座来做匹配...

2022-11-03 05:43:32查看全文 >>

如何做手帐胶带不用双面胶(自己做手帐胶带不用双面胶的那种)

如何做手帐胶带不用双面胶(自己做手帐胶带不用双面胶的那种)

从小到大,我都是个文具控,严格说来是本子控。从小学时候就开始买笔记本,后来喜欢买带有插画的、小清新的笔记本。这些本子有的...

2022-11-03 05:47:35查看全文 >>

文档排行