线程池总结

1.Executors

Executors.newFixedThreadPool:可控制线程的最大并发数,超出的线程会在队列中等待。适用于执行1个长期的任务。底层是ThreadPoolExecutor。它使用了LinkedBlockingQueue。
Executors.newSingleThreadExecutor:只会用唯一的工作线程来执行任务,保证所有任务都按照指定顺序执行。底层是ThreadPoolExecutor。它使用了LinkedBlockingQueue。
Executors.newCachedThreadPool:如果线程池长度超过处理需要,可灵活回收空闲线程;若无可回收,则创建新线程。底层是ThreadPoolExecutor。它使用了SynchronousQueue。
Executors.newScheduledThreadPool
Executors.newWorkStealingPool

2.7大参数

corePoolSize
maximumPoolSize
keepAliveTime:多余的线程存活时间。当空闲时间达到keepAliveTime时,多余的线程会被销毁直到剩下corepoolSize个。只有当线程池中的线程数大于corePoolSize时keepAliveTime才会起作用,直到线程池中的线程数不大于corepoolSize。
TimeUnit
workQueue:任务队列。存放被提交但还未被执行的任务。
threadFactory:生成工作线程的线程工厂。一般使用默认的即可:Executors.defaultThreadFactory()。
RejectedExecutionHandler:拒绝策略。

3.工作原理

3.1创建了线程池后,等待使用者提交任务。
3.2当调用execute方法添加一个任务时,线程池进行判断:
	3.2.1如果真在运行的线程数量小于corePoolSize,那么马上创建线程运行这个任务
	3.2.2如果真在运行的线程数量大于等于corePoolSize,那么将这个任务放入任务队列
	3.2.3如果队列满了且正在运行的线程数量小于maximumPoolSize,那么创建非核心线程立刻运行这个任务
	3.2.4如果队列满了且正在运行的线程数量大于等于maximumPoolSize,那么线程池执行拒绝策略
3.3当一个工作线程完成任务时,它会从任务队列中取下一个任务来执行。
3.4当一个空闲线程超过	keepAliveTime时,线程池会判断:如果当前运行的线程数大于corePoolSize,那么这个线程会被停掉。

4.拒绝策略:RejectedExecutionHandler接口

触发条件:等待队列也已经排满了,再也塞不下新的任务了,同时线程池的max也到达了,无法接续为新任务服务。
AbortPolicy:直接抛出异常,默认策略。
CallerRunsPolicy:用调用者所在的线程来执行任务。
DiscardOldestPolicy:丢弃阻塞队列中靠最前的任务,并执行当前任务。
DiscardPolicy:直接丢弃任务。

5.自定义线程池

为什么要自定义:1)FixedThreadPool和SingleThreadPool:允许的请求队列长度为Integer.MAX_VALUE,可能会堆积大量的请求,从而导致OOM。
			  2)CachedThreadPool和ScheduledThreadPool:允许的创建线程数量为Integer.MAX_VALUE,可能会创建大量的线程,从而导致OOM。
ExecutorService threadPool = new ThreadPoolExecutor(2,5,1L,TimeUnit.SECONDS,new LinkedBlockingDeque<Runnable>(3),Executors.defaultThreadFactory(),new ThreadPoolExecutor.DiscardPolicy());

6.参数调优

CPU密集型:任务需要大量的运算,没有阻塞,CPU一直全速运行。应当分配尽可能少的线程,线程池大小:CPU核数+1
IO密集型:方案一、工作线程不是一直在执行任务。应当多配置线程数,线程池大小:CPU核数*2
		 方案二、任务需要大量的IO,大量线程阻塞,应当多配置线程数,线程池大小:CPU核数/(1-阻塞系数)。0.8≤阻塞系数≤0.9
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值