当前位置:首页 > 科技  > 软件

四种常见线程池的原理,你学会了吗?

来源: 责编: 时间:2023-10-30 17:24:14 176观看
导读newFixedThreadPool (固定数目线程的线程池)newCachedThreadPool (可缓存线程的线程池)newSingleThreadExecutor (单线程的线程池)newScheduledThreadPool (定时及周期执行的线程池)前三种线程池的构造直接调用Thread

newFixedThreadPool (固定数目线程的线程池)06V28资讯网——每日最新资讯28at.com

06V28资讯网——每日最新资讯28at.com

newCachedThreadPool (可缓存线程的线程池)06V28资讯网——每日最新资讯28at.com

06V28资讯网——每日最新资讯28at.com

newSingleThreadExecutor (单线程的线程池)06V28资讯网——每日最新资讯28at.com

06V28资讯网——每日最新资讯28at.com

newScheduledThreadPool (定时及周期执行的线程池)06V28资讯网——每日最新资讯28at.com

06V28资讯网——每日最新资讯28at.com

前三种线程池的构造直接调用ThreadPoolExecutor的构造方法。06V28资讯网——每日最新资讯28at.com

06V28资讯网——每日最新资讯28at.com

newSingleThreadExecutor

06V28资讯网——每日最新资讯28at.com

public static ExecutorService newSingleThreadExecutor(ThreadFactory threadFactory) {  return new FinalizableDelegatedExecutorService(new ThreadPoolExecutor(1, 1,0L,TimeUnit.MILLISECONDS,  	new LinkedBlockingQueue<Runnable>(),threadFactory));}

线程池特点:06V28资讯网——每日最新资讯28at.com

06V28资讯网——每日最新资讯28at.com

核心线程数:106V28资讯网——每日最新资讯28at.com

06V28资讯网——每日最新资讯28at.com

最大线程数:106V28资讯网——每日最新资讯28at.com

06V28资讯网——每日最新资讯28at.com

阻塞队列是无界队列LinkedBlockingQueue,可能会导致OOM06V28资讯网——每日最新资讯28at.com

06V28资讯网——每日最新资讯28at.com

keepAliveTime:006V28资讯网——每日最新资讯28at.com

06V28资讯网——每日最新资讯28at.com

06V28资讯网——每日最新资讯28at.com

06V28资讯网——每日最新资讯28at.com

06V28资讯网——每日最新资讯28at.com

工作流程:06V28资讯网——每日最新资讯28at.com

06V28资讯网——每日最新资讯28at.com

1、提交任务06V28资讯网——每日最新资讯28at.com

06V28资讯网——每日最新资讯28at.com

2、线程池是否有一条线程在,如果没有,新建线程执行任务06V28资讯网——每日最新资讯28at.com

06V28资讯网——每日最新资讯28at.com

3、如果有,将任务加到阻塞队列06V28资讯网——每日最新资讯28at.com

06V28资讯网——每日最新资讯28at.com

4、当前的唯一线程,从队列取任务,执行完一个,再继续,一个线程执行任务06V28资讯网——每日最新资讯28at.com

06V28资讯网——每日最新资讯28at.com

适用场景:06V28资讯网——每日最新资讯28at.com

06V28资讯网——每日最新资讯28at.com

适用于串行执行任务的场景,一个任务一个任务地执行06V28资讯网——每日最新资讯28at.com

06V28资讯网——每日最新资讯28at.com

newFixedThreadPool

06V28资讯网——每日最新资讯28at.com

public static ExecutorService newFixedThreadPool(int nThreads, ThreadFactory threadFactory) {  return new ThreadPoolExecutor(nThreads, nThreads,0L,TimeUnit.MILLISECONDS,  	new LinkedBlockingQueue<Runnable>(), threadFactory);}

线程池特点:06V28资讯网——每日最新资讯28at.com

06V28资讯网——每日最新资讯28at.com

核心线程数和最大线程数大小一样;06V28资讯网——每日最新资讯28at.com

06V28资讯网——每日最新资讯28at.com

没有所谓的非空闲时间,即keepAliveTime为0;06V28资讯网——每日最新资讯28at.com

06V28资讯网——每日最新资讯28at.com

阻塞队列为无界队列LinkedBlockingQueue,可能会导致OOM;06V28资讯网——每日最新资讯28at.com

06V28资讯网——每日最新资讯28at.com


06V28资讯网——每日最新资讯28at.com

06V28资讯网——每日最新资讯28at.com

06V28资讯网——每日最新资讯28at.com

工作流程:06V28资讯网——每日最新资讯28at.com

06V28资讯网——每日最新资讯28at.com

1、提交任务;06V28资讯网——每日最新资讯28at.com

06V28资讯网——每日最新资讯28at.com

2、如果线程数少于核心线程,创建核心线程执行任务;06V28资讯网——每日最新资讯28at.com

06V28资讯网——每日最新资讯28at.com

3、如果线程数等于核心线程,把任务添加到LinkedBlockingQueue阻塞队列;06V28资讯网——每日最新资讯28at.com

06V28资讯网——每日最新资讯28at.com

4、如果线程执行完任务,去阻塞队列取任务,继续执行。06V28资讯网——每日最新资讯28at.com

06V28资讯网——每日最新资讯28at.com

适用场景:06V28资讯网——每日最新资讯28at.com

06V28资讯网——每日最新资讯28at.com

FixedThreadPool适用于处理CPU密集型的任务,确保CPU在长期被工作线程使用的情况下,尽可能少的分配线程,即适用执行长期的任务。06V28资讯网——每日最新资讯28at.com

06V28资讯网——每日最新资讯28at.com

newCachedThreadPool

06V28资讯网——每日最新资讯28at.com

public static ExecutorService newCachedThreadPool(ThreadFactory threadFactory) {  return new ThreadPoolExecutor(0, Integer.MAX_VALUE, 60L, TimeUnit.SECONDS,  	new SynchronousQueue<Runnable>(), threadFactory);}

线程池特点:06V28资讯网——每日最新资讯28at.com

06V28资讯网——每日最新资讯28at.com

核心线程数为0;06V28资讯网——每日最新资讯28at.com

06V28资讯网——每日最新资讯28at.com

最大线程数为Integer.MAX_VALUE,即无限大,可能会因为无线创建线程,导致OOM06V28资讯网——每日最新资讯28at.com

06V28资讯网——每日最新资讯28at.com

阻塞队列是SynchronousQueue06V28资讯网——每日最新资讯28at.com

06V28资讯网——每日最新资讯28at.com

非核心线程空闲存活时间为60s06V28资讯网——每日最新资讯28at.com

06V28资讯网——每日最新资讯28at.com

当提交任务速度大于处理任务的速度时,每次提交一个任务,就必然会创建一个线程。06V28资讯网——每日最新资讯28at.com

06V28资讯网——每日最新资讯28at.com

极端情况下会创建过多的线程,耗尽CPU和内存资源。由于空闲60秒的线程会被终止,长时间保持空闲的CachedThreadPool不会占用任何资源。06V28资讯网——每日最新资讯28at.com

06V28资讯网——每日最新资讯28at.com


06V28资讯网——每日最新资讯28at.com

06V28资讯网——每日最新资讯28at.com

06V28资讯网——每日最新资讯28at.com

工作流程:06V28资讯网——每日最新资讯28at.com

06V28资讯网——每日最新资讯28at.com

提交任务;06V28资讯网——每日最新资讯28at.com

06V28资讯网——每日最新资讯28at.com

因为没有核心线程,所以任务会直接加到SynchronousQueue队列;06V28资讯网——每日最新资讯28at.com

06V28资讯网——每日最新资讯28at.com

判断是否有空闲线程,如果有,就去取出任务执行;06V28资讯网——每日最新资讯28at.com

06V28资讯网——每日最新资讯28at.com

如果没有空闲线程,就新建一个线程执行;06V28资讯网——每日最新资讯28at.com

06V28资讯网——每日最新资讯28at.com

执行完任务的线程,还可以存活60s,如果在这期间接到任务,就可以继续活下去,否则被销毁。06V28资讯网——每日最新资讯28at.com

06V28资讯网——每日最新资讯28at.com

适用场景:06V28资讯网——每日最新资讯28at.com

06V28资讯网——每日最新资讯28at.com

用于并发执行大量短期的小任务。06V28资讯网——每日最新资讯28at.com

06V28资讯网——每日最新资讯28at.com

newScheduleThreadPool

public ScheduledThreadPoolExecutor(int corePoolSize) {  super(corePoolSize, Integer.MAX_VALUE, 0, NANOSECONDS, new DelayedWorkQueue());}

线程池特点:06V28资讯网——每日最新资讯28at.com

06V28资讯网——每日最新资讯28at.com

最大线程数为Integer.MAX_VALUE,也有OOM风险06V28资讯网——每日最新资讯28at.com

06V28资讯网——每日最新资讯28at.com

阻塞队列是DelayedWorkQueue06V28资讯网——每日最新资讯28at.com

06V28资讯网——每日最新资讯28at.com

keepAliveTime为006V28资讯网——每日最新资讯28at.com

06V28资讯网——每日最新资讯28at.com

scheduleAtFixedRate():按某种速率周期执行06V28资讯网——每日最新资讯28at.com

06V28资讯网——每日最新资讯28at.com

scheduleWithFixedDelay():在某个延迟后执行06V28资讯网——每日最新资讯28at.com

06V28资讯网——每日最新资讯28at.com

06V28资讯网——每日最新资讯28at.com

06V28资讯网——每日最新资讯28at.com

06V28资讯网——每日最新资讯28at.com

工作机制:06V28资讯网——每日最新资讯28at.com

06V28资讯网——每日最新资讯28at.com

线程从DelayQueue中获取已到期的ScheduledFutureTask(DelayQueue.take())。到期任务是指ScheduledFutureTask的time大于等于当前时间。06V28资讯网——每日最新资讯28at.com

06V28资讯网——每日最新资讯28at.com

线程执行这个ScheduleFutureTask06V28资讯网——每日最新资讯28at.com

06V28资讯网——每日最新资讯28at.com

线程修改ScheduledFutureTask的time变量为下次将要被执行的时间06V28资讯网——每日最新资讯28at.com

06V28资讯网——每日最新资讯28at.com

线程把这个修改time之后的ScheduledFutureTask放回DelayQueue中(DelayQueue.add())。06V28资讯网——每日最新资讯28at.com

06V28资讯网——每日最新资讯28at.com


06V28资讯网——每日最新资讯28at.com

06V28资讯网——每日最新资讯28at.com

06V28资讯网——每日最新资讯28at.com

使用场景:06V28资讯网——每日最新资讯28at.com

06V28资讯网——每日最新资讯28at.com

周期性执行任务的场景,需要限制线程数量的场景。06V28资讯网——每日最新资讯28at.com

06V28资讯网——每日最新资讯28at.com

使用无界队列的线程池会导致什么问题:06V28资讯网——每日最新资讯28at.com

例如newFixedThreadPool使用了无界的阻塞队列LinkedBlockingQueue,如果线程获取一个任务后,任务的执行时间比较长,会导致队列的任务越积越多,导致机器内存使用不停飙升,最终导致OOM。06V28资讯网——每日最新资讯28at.com

本文链接://www.dmpip.com//www.dmpip.com/showinfo-26-15863-0.html四种常见线程池的原理,你学会了吗?

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: 使用Frida在Windows中拦截C++函数

下一篇: Kubernetes使用OkHttp客户端进行网络负载均衡

标签:
  • 热门焦点
  • 一加Ace2 Pro官宣:普及16G内存 引领24G

    一加Ace2 Pro官宣:普及16G内存 引领24G

    一加官方今天继续为本月发布的新机一加Ace2 Pro带来预热,公布了内存方面的信息。“淘汰 8GB ,12GB 起步,16GB 普及,24GB 引领,还有呢?#一加Ace2Pro#,2023 年 8 月,敬请期待。”同时
  • 6月iOS设备好评榜:第一蝉联榜首近一年

    6月iOS设备好评榜:第一蝉联榜首近一年

    作为安兔兔各种榜单里变化最小的那个,2023年6月的iOS好评榜和上个月相比没有任何排名上的变化,仅仅是部分设备好评率的下降,长年累月的用户评价和逐渐退出市场的老款机器让这
  • 雅柏威士忌多款单品价格大跌,泥煤顶流也不香了?

    雅柏威士忌多款单品价格大跌,泥煤顶流也不香了?

    来源 | 烈酒商业观察编 | 肖海林今年以来,威士忌市场开始出现了降温迹象,越来越多不断暴涨的网红威士忌也开始悄然回归市场理性。近日,LVMH集团旗下苏格兰威士忌品牌雅柏(Ardbeg
  • 慕岩炮轰抖音,百合网今何在?

    慕岩炮轰抖音,百合网今何在?

    来源:价值研究所 作者:Hernanderz&ldquo;难道就因为自己的一个产品牛逼了,从客服到总裁,都不愿意正视自己产品和运营上的问题,选择逃避了吗?&rdquo;这一番话,出自百合网联合创
  • 梁柱接棒两年,腾讯音乐闯出新路子

    梁柱接棒两年,腾讯音乐闯出新路子

    文丨田静 出品丨牛刀财经(niudaocaijing)7月5日,企鹅FM发布官方公告称由于业务调整,将于9月6日正式停止运营,这意味着腾讯音乐长音频业务走向消亡。腾讯在长音频领域还在摸索。为
  • 大厂卷向扁平化

    大厂卷向扁平化

    来源:新熵作者丨南枝 编辑丨月见大厂职级不香了。俗话说,兵无常势,水无常形,互联网企业调整职级体系并不稀奇。7月13日,淘宝天猫集团启动了近年来最大的人力制度改革,目前已形成一
  • 网红炒股不为了赚钱,那就是耍流氓!

    网红炒股不为了赚钱,那就是耍流氓!

    来源:首席商业评论6月26日高调宣布入市,网络名嘴大v胡锡进居然进军了股市。在一次财经媒体峰会上,几个财经圈媒体大佬就&ldquo;胡锡进炒股是否知道认真报道&rdquo;展开讨论。有
  • 三星电子Q2营收60万亿韩元 存储业务营收同比仍下滑超过50%

    三星电子Q2营收60万亿韩元 存储业务营收同比仍下滑超过50%

    7月27日消息,据外媒报道,从三星电子所发布的财报来看,他们主要利润来源的存储芯片业务在今年二季度仍不乐观,营收同比仍在大幅下滑,所在的设备解决方案
  • 联想的ThinkBook Plus下一版曝光,键盘旁边塞个平板

    联想的ThinkBook Plus下一版曝光,键盘旁边塞个平板

    ThinkBook Plus 是联想的一个特殊笔记本类别,它在封面放入了一块墨水屏,也给人留下了较为深刻的印象。据有人爆料,联想的下一款 ThinkBook Plus 可能更特殊,它
Top
Baidu
map