博客 微服务 Java线程池技术应用-2

微服务 Java线程池技术应用-2

   数栈君   发表于 2023-10-09 16:27  448  0

2、线程池
线程池就是存放线程的池子,池子里存放了很多可以复用的线程。
使用线程池的优势

提高效率,创建好一定数量的线程放在池中,等需要使用的时候就从池中拿一个,这要比需要的时候创建一个线程对象要快的多。
减少了创建和销毁线程的次数,每个工作线程都可以被重复利用,可执行多个任务。
提升系统响应速度,假如创建线程用的时间为T1,执行任务用的时间为T2,销毁线程用的时间为T3,那么使用线程池就免去了T1和T3的时间;


2.1、五种创建线程的方式
//创建一个单线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行
ExecutorService executorService = Executors.newSingleThreadExecutor();
//创建一个定长的线程池,可控制最大并发数,超出的线程进行队列等待。 ExecutorService executorService =
Executors.newFixedThreadPool(2); //可以创建定长的、支持定时任务,周期任务执行。
ExecutorService executorService = Executors.newScheduledThreadPool(2);
//创建一个可以缓存的线程池,如果线程池长度超过处理需要,可以灵活回收空闲线程,没回收的话就新建线程 ExecutorService
executorService = Executors.newCachedThreadPool(); //创建一个具有抢占式操作的线程池
ExecutorService executorService = Executors.newWorkStealingPool();

2.2、new ThreadPoolExecutor()创建线程
public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue,
ThreadFactory threadFactory,
RejectedExecutionHandler handler)
1
2
3
4
5
6
7
参数说明:

参数 含义 解释
corePoolSize 该线程池中核心线程数最大值 核心线程生命周期无限,即使空闲也不会死亡
maximumPoolSize 线程总数最大值 任务队列满了以后当有新任务进来则会增加一个线程来处理新任务(线程总数<maximumPoolSize )
keepAliveTime 闲置超时时间 当线程数大于核心线程数时,超过keepAliveTime时间将会回收非核心线程
unit keepAliveTime 的单位
workQueue 线程池中的任务队列 *
threadFactory 为线程池提供创建新线程的线程工厂 *
RejectedExecutionHandler 饱和策略 抛出异常专用,当队列和最大线程池都满了之后的饱和策略。


2.2.1、拒绝策略
ThreadPoolExecutor的饱和策略可以通过调用setRejectedExecutionHandler来修改。JDK提供了几种不同的RejectedExecutionHandler实现,每种实现都包含有不同的饱和策略:AbortPolicy、CallerRunsPolicy、DiscardPolicy和DiscardOldestPolicy。

拒绝策略如下:

CallerRunsPolicy : 调用线程处理任务
AbortPolicy : 抛出异常
DiscardPolicy : 直接丢弃
DiscardOldestPolicy : 丢弃队列中最老的任务,执行新任务
RejectedExecutionHandler rejected = null;

//默认策略,阻塞队列满,则丢任务、抛出异常
rejected = new ThreadPoolExecutor.AbortPolicy();

//阻塞队列满,则丢任务,不抛异常
rejected = new ThreadPoolExecutor.DiscardPolicy();

//删除队列中最旧的任务(最早进入队列的任务),尝试重新提交新的任务
rejected = new ThreadPoolExecutor.DiscardOldestPolicy();

//队列满,不丢任务,不抛异常,若添加到线程池失败,那么主线程会自己去执行该任务
rejected = new ThreadPoolExecutor.CallerRunsPolicy();



免责申明:


本文系转载,版权归原作者所有,如若侵权请联系我们进行删除!

《数据治理行业实践白皮书》下载地址:https://fs80.cn/4w2atu

《数栈V6.0产品白皮书》下载地址:
https://fs80.cn/cw0iw1

想了解或咨询更多有关袋鼠云大数据产品、行业解决方案、客户案例的朋友,浏览袋鼠云官网:
https://www.dtstack.com/?src=bbs

同时,欢迎对大数据开源项目有兴趣的同学加入「袋鼠云开源框架钉钉技术群」,交流最新开源技术信息,群号码:30537511,项目地址:
https://github.com/DTStack

0条评论
社区公告
  • 大数据领域最专业的产品&技术交流社区,专注于探讨与分享大数据领域有趣又火热的信息,专业又专注的数据人园地

最新活动更多
微信扫码获取数字化转型资料
钉钉扫码加入技术交流群