【高并发】不得不说的线程池与ThreadPoolExecutor类浅析

手机游戏开发者 2024-10-6 10:46:45 31 0 来自 中国
各人好,我是冰河~~
本日,我们一起来简朴聊聊线程池中的ThreadPoolExecutor类,好了,不多说了,开始进入本日的正题。
一、抛砖引玉

既然Java中支持以多线程的方式来实行相应的任务,但为什么在JDK1.5中又提供了线程池技能呢?这个题目各人自行脑补,多动脑,肯定没毛病,哈哈哈。。。
说起Java中的线程池技能,在很多框架和异步处置处罚中央件中都有涉及,而且性能继承起了恒久的磨练。可以如许说,Java的线程池技能是Java最焦点的技能之一,在Java的高并发范畴中,Java的线程池技能是一个永远绕不开的话题。既然Java的线程池技能这么重要(怎么能说是这么重要呢?那是相称的重要,那家伙老重要了,哈哈哈),那么,本文我们就来简朴的说下线程池与ThreadPoolExecutor类。至于线程池中的各个技能细节和ThreadPoolExecutor的底层原理和源码剖析,我们会在【高并发专题】专栏中举行深度剖析。
弁言:本文是高并发中线程池的开篇之作,就暂时先不深入解说,只是让各人从团体上熟悉下线程池中最焦点的类之一——ThreadPoolExecutor,关于ThreadPoolExecutor的底层原理和源码实现,以及线程池中的其他技能细节的底层原理和源码实现,我们会在【高并发专题】接下来的文章中,举行死磕。
二、Thread直接创建线程的毛病

(1)每次new Thread新建对象,性能差。
(2)线程缺乏同一管理,大概无穷定的新建线程,相互竞争,有大概占用过多体系资源导致死机或OOM。
(3)缺少更多的功能,如更多实行、定期实行、线程停止。
(4)其他毛病,各人自行脑补,多动脑,没毛病,哈哈。
三、线程池的利益

(1)重用存在的线程,镌汰对象创建、消亡的开销,性能佳。
(2)可以有效控制最大并发线程数,进步体系资源使用率,同时可以制止过多资源竞争,制止壅闭。
(3)提供定时实行、定期实行、单线程、并发数控制等功能。
(4)提供支持线程池监控的方法,可对线程池的资源举行实时监控。
(5)其他利益,各人自行脑补,多动脑,没毛病,哈哈。
四、线程池

1.线程池类结构关系

线程池中的一些接口和类的结构关系如下图所示。

1.png 后文会死磕这些接口和类的底层原理和源码。
2.创建线程池常用的类——Executors


  • Executors.newCachedThreadPool:创建一个可缓存的线程池,如果线程池的巨细高出了需要,可以机动接纳空闲线程,如果没有可接纳线程,则新建线程
  • Executors.newFixedThreadPool:创建一个定长的线程池,可以控制线程的最大并发数,超出的线程会在队列中期待
  • Executors.newScheduledThreadPool:创建一个定长的线程池,支持定时、周期性的任务实行
  • Executors.newSingleThreadExecutor: 创建一个单线程化的线程池,使用一个唯一的工作线程实行任务,包管全部任务按照指定次序(先入先出大概优先级)实行
  • Executors.newSingleThreadScheduledExecutor:创建一个单线程化的线程池,支持定时、周期性的任务实行
  • Executors.newWorkStealingPool:创建一个具有并行级别的work-stealing线程池
3.线程池实例的几种状态


  • Running:运行状态,能罗致新提交的任务,而且也能处置处罚壅闭队列中的任务
  • Shutdown: 关闭状态,不能再罗致新提交的任务,但是可以处置处罚壅闭队列中已经生存的任务,当线程池处于Running状态时,调用shutdown()方法会使线程池进入该状态
  • Stop: 不能罗致新任务,也不能处置处罚壅闭队列中已经生存的任务,会停止正在处置处罚任务的线程,如果线程池处于Running或Shutdown状态,调用shutdownNow()方法,会使线程池进入该状态
  • Tidying: 如果全部的任务都已经停止,有效线程数为0(壅闭队列为空,线程池中的工作线程数目为0),线程池就会进入该状态。
  • Terminated: 处于Tidying状态的线程池调用terminated()方法,会使用线程池进入该状态
注意:不需要对线程池的状态做特别的处置处罚,线程池的状态是线程池内部根据方法自行界说和处置处罚的。
4.公道配置线程的一些发起

(1)CPU密集型任务,就需要只管压榨CPU,参考值可以设置为NCPU+1(CPU的数目加1)。
(2)IO密集型任务,参考值可以设置为2*NCPU(CPU数目乘以2)
五、线程池最焦点的类之一——ThreadPoolExecutor

1.构造方法

ThreadPoolExecutor参数最多的构造方法如下:
您需要登录后才可以回帖 登录 | 立即注册

Powered by CangBaoKu v1.0 小黑屋藏宝库It社区( 冀ICP备14008649号 )

GMT+8, 2024-11-23 16:20, Processed in 0.197326 second(s), 36 queries.© 2003-2025 cbk Team.

快速回复 返回顶部 返回列表