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

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

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

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

2yj28资讯网——每日最新资讯28at.com

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

2yj28资讯网——每日最新资讯28at.com

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

2yj28资讯网——每日最新资讯28at.com

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

2yj28资讯网——每日最新资讯28at.com

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

2yj28资讯网——每日最新资讯28at.com

newSingleThreadExecutor

2yj28资讯网——每日最新资讯28at.com

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

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

2yj28资讯网——每日最新资讯28at.com

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

2yj28资讯网——每日最新资讯28at.com

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

2yj28资讯网——每日最新资讯28at.com

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

2yj28资讯网——每日最新资讯28at.com

keepAliveTime:02yj28资讯网——每日最新资讯28at.com

2yj28资讯网——每日最新资讯28at.com

2yj28资讯网——每日最新资讯28at.com

2yj28资讯网——每日最新资讯28at.com

2yj28资讯网——每日最新资讯28at.com

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

2yj28资讯网——每日最新资讯28at.com

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

2yj28资讯网——每日最新资讯28at.com

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

2yj28资讯网——每日最新资讯28at.com

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

2yj28资讯网——每日最新资讯28at.com

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

2yj28资讯网——每日最新资讯28at.com

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

2yj28资讯网——每日最新资讯28at.com

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

2yj28资讯网——每日最新资讯28at.com

newFixedThreadPool

2yj28资讯网——每日最新资讯28at.com

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

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

2yj28资讯网——每日最新资讯28at.com

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

2yj28资讯网——每日最新资讯28at.com

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

2yj28资讯网——每日最新资讯28at.com

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

2yj28资讯网——每日最新资讯28at.com


2yj28资讯网——每日最新资讯28at.com

2yj28资讯网——每日最新资讯28at.com

2yj28资讯网——每日最新资讯28at.com

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

2yj28资讯网——每日最新资讯28at.com

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

2yj28资讯网——每日最新资讯28at.com

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

2yj28资讯网——每日最新资讯28at.com

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

2yj28资讯网——每日最新资讯28at.com

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

2yj28资讯网——每日最新资讯28at.com

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

2yj28资讯网——每日最新资讯28at.com

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

2yj28资讯网——每日最新资讯28at.com

newCachedThreadPool

2yj28资讯网——每日最新资讯28at.com

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

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

2yj28资讯网——每日最新资讯28at.com

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

2yj28资讯网——每日最新资讯28at.com

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

2yj28资讯网——每日最新资讯28at.com

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

2yj28资讯网——每日最新资讯28at.com

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

2yj28资讯网——每日最新资讯28at.com

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

2yj28资讯网——每日最新资讯28at.com

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

2yj28资讯网——每日最新资讯28at.com


2yj28资讯网——每日最新资讯28at.com

2yj28资讯网——每日最新资讯28at.com

2yj28资讯网——每日最新资讯28at.com

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

2yj28资讯网——每日最新资讯28at.com

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

2yj28资讯网——每日最新资讯28at.com

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

2yj28资讯网——每日最新资讯28at.com

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

2yj28资讯网——每日最新资讯28at.com

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

2yj28资讯网——每日最新资讯28at.com

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

2yj28资讯网——每日最新资讯28at.com

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

2yj28资讯网——每日最新资讯28at.com

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

2yj28资讯网——每日最新资讯28at.com

newScheduleThreadPool

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

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

2yj28资讯网——每日最新资讯28at.com

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

2yj28资讯网——每日最新资讯28at.com

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

2yj28资讯网——每日最新资讯28at.com

keepAliveTime为02yj28资讯网——每日最新资讯28at.com

2yj28资讯网——每日最新资讯28at.com

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

2yj28资讯网——每日最新资讯28at.com

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

2yj28资讯网——每日最新资讯28at.com

2yj28资讯网——每日最新资讯28at.com

2yj28资讯网——每日最新资讯28at.com

2yj28资讯网——每日最新资讯28at.com

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

2yj28资讯网——每日最新资讯28at.com

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

2yj28资讯网——每日最新资讯28at.com

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

2yj28资讯网——每日最新资讯28at.com

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

2yj28资讯网——每日最新资讯28at.com

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

2yj28资讯网——每日最新资讯28at.com


2yj28资讯网——每日最新资讯28at.com

2yj28资讯网——每日最新资讯28at.com

2yj28资讯网——每日最新资讯28at.com

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

2yj28资讯网——每日最新资讯28at.com

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

2yj28资讯网——每日最新资讯28at.com

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

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

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

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

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

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

标签:
  • 热门焦点
  • Mate60手机壳曝光 致敬自己的经典设计

    8月3日消息,今天下午博主数码闲聊站带来了华为Mate60的第三方手机壳图,可以让我们在真机发布之前看看这款华为全新旗舰的大致轮廓。从曝光的图片看,Mate 60背后摄像头面积依然
  • 小米平板5 Pro 12.4简评:多专多能 兼顾影音娱乐的大屏利器

    疫情带来了网课,网课盘活了安卓平板,安卓平板市场虽然中途停滞了几年,但好的一点就是停滞的这几年行业又有了新的发展方向,例如超窄边框、高刷新率、多摄镜头组合等,这就让安卓
  • K6:面向开发人员的现代负载测试工具

    K6 是一个开源负载测试工具,可以轻松编写、运行和分析性能测试。它建立在 Go 和 JavaScript 之上,它被设计为功能强大、可扩展且易于使用。k6 可用于测试各种应用程序,包括 Web
  • Flowable工作流引擎的科普与实践

    一.引言当我们在日常工作和业务中需要进行各种审批流程时,可能会面临一系列技术和业务上的挑战。手动处理这些审批流程可能会导致开发成本的增加以及业务复杂度的上升。在这
  • 深度探索 Elasticsearch 8.X:function_score 参数解读与实战案例分析

    在 Elasticsearch 中,function_score 可以让我们在查询的同时对搜索结果进行自定义评分。function_score 提供了一系列的参数和函数让我们可以根据需求灵活地进行设置。近期
  • 破圈是B站头上的紧箍咒

    来源 | 光子星球撰文 | 吴坤谚编辑 | 吴先之每年的暑期档都少不了瞄准追剧女孩们的古偶剧集,2021年有优酷的《山河令》,2022年有爱奇艺的《苍兰诀》,今年却轮到小破站抓住了追
  • 大厂卷向扁平化

    来源:新熵作者丨南枝 编辑丨月见大厂职级不香了。俗话说,兵无常势,水无常形,互联网企业调整职级体系并不稀奇。7月13日,淘宝天猫集团启动了近年来最大的人力制度改革,目前已形成一
  • 华为发布HarmonyOS 4:更好玩、更流畅、更安全

    在8月4日的华为开发者大会2023(HDC.Together)大会上,HarmonyOS 4正式发布。自2019年发布以来,HarmonyOS一直以用户为中心,经历四年多的发展HarmonyOS已
  • 荣耀Magic4 至臻版 首创智慧隐私通话 强劲影音系统

    2022年第一季度临近尾声,在该季度内,许多品牌陆续发布自己的最新产品,让大家从全新的角度来了解当今的手机技术。手机是电子设备中,更新迭代十分迅速的一款产品,基
Top