Java ThreadPoolExecutor 线程池总结

介绍

线程池就是管理线程的池子,当有任务要处理时,不用频繁创建新线程,而是从池子拿个线程来处理。
当任务执行完,线程并不会销毁,而是在等待下一个任务。
因此可以节省资源,提高响应速度还可以提高线程的可管理性

execute()提交任务执行逻辑

在这里插入图片描述

当有任务提交的时候,首先判断核心线程池是否已满,如果未满,创建核心线程执行任务,如果满了将任务添加到队列中,如果队列也满了,判断线程池是否已满,如果未满,创建非核心线程执行任务,如果已满,执行饱和策略

线程池的参数

7个参数:
在这里插入图片描述

饱和策略

线程池的饱和策略主要有四种类型:

  1. AbortPolicy 抛出一个异常,默认的
    在这里插入图片描述

  2. DiscardPolicy 新提交的任务直接被抛弃 空实现,直接吞掉
    在这里插入图片描述

  3. DiscardOldestPolicy 丢弃队伍里面最老的任务(去掉队头元素),将当前这个任务继续提交给线程池
    在这里插入图片描述

  4. CallerRunsPolicy 交给线程池调用所在的线程进行处理,即将某些任务回退到调用者
    在这里插入图片描述

还可以实现RejectedExecutionHandler接口来实现自定义的handler

threadFactory的用处

  1. 给线程设置自定义的名字
  2. 可以设置为守护线程,当程序结束时保证JVM安全退出。
  3. 可以设置异常处理器

Executors实现的线程池

  1. Executors.newSingleThreadExecutor()
    在这里插入图片描述
    用到LinkedBlockingQueuecore为1max为1
    适用场景:串行执行任务,一个任务一个任务地执行。

  2. Executors.newFixedThreadPool()
    在这里插入图片描述
    用到LinkedBlockingQueuecore为设定值max为设定值
    适用场景:处理CPU密集型任务,尽可能少的分配线程,适用执行长期的任务。

  3. Executors.newCachedThreadPool()
    在这里插入图片描述
    用到SynchronousQueuecore为0max为MAX_VALUE
    适用场景:并发执行大量短期的小任务

  4. Executors.newScheduledThreadPool()
    在这里插入图片描述
    用到DelayedWorkQueuecore为设定值max为MAX_VALUE
    适用场景:周期性执行任务

  5. Executors.newWorkStealingPool()
    在这里插入图片描述
    内部会构建ForkJoinPool,利用work-stealing算法,并行处理任务,不保证处理顺序

线程池使用不当的问题

  1. 内存飙升
    线程池未关闭而造成线程无法被回收,线程数持续增加。
  2. 线程死锁
    如果提交到相同线程池的任务不是相互独立的,而是有依赖关系的,那么就有可能导致线程死锁。
    具体现象是应用每运行一段时间偶尔就会处于无响应的状态,监控数据看上去一切都正常,但是实际上已经不能正常工作了。
    解决:为不同的任务创建不同的线程池

如何设置线程池最大线程数

获取核数:Runtime.getRunTime().avaliableProcessors()
CPU密集型: 核数 + 1
为什么要加一?
计算(CPU)密集型的线程恰好在某时因为发生一个页错误或者因其他原因而暂停,刚好有一个“额外”的线程,可以确保在这种情况下CPU周期不会中断工作。
IO密集型 : 线程数 = CPU核数 * (1 + 平均等待时间(I/O耗时) / 平均工作时间(CPU耗时))

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

mangoBUPT

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值