面试被问到了解线程池的拒绝策略,如何回答?

如果你只知道线程池的几个参数,面试被问到再深一点的内容就回答不上来了,那么本系列文章带你熟悉线程池源码,更深入的了解线程池。

ThreadPoolExecutor将分几篇文章做解析,本文是第三篇,第一篇请见面试被问到线程池的状态是怎么计算的,如何回答?,关注一波,不错过后续内容,下面是核心知识点。本篇文章讲解线程池拒绝策略、总结一下线程池。

一、线程池拒绝策略

前面文章介绍过线程池的构造参数,其中有一个是拒绝策略RejectedExecutionHandler,当提交的任务数大于(workQueue.size() + maximumPoolSize )或者线程池状态异常时,就会触发线程池的拒绝策略。

jdk默认提供了四种拒绝策略:

1.AbortPolicy - 丢弃任务,并抛出拒绝执行 RejectedExecutionException 异常信息。线程池默认的拒绝策略。必须处理好抛出的异常,否则会打断当前的执行流程,影响后续的任务执行。

2.CallerRunsPolicy - 当触发拒绝策略,只要线程池没有关闭的话,则使用调用线程直接运行任务。一般并发比较小,性能要求不高,不允许失败。但是,由于调用者自己运行任务,如果任务提交速度过快,可能导致程序阻塞,性能效率上必然损失较大。

3.DiscardPolicy - 直接丢弃,其他啥都没有

4.DiscardOldestPolicy - 当触发拒绝策略,只要线程池没有关闭的话,丢弃阻塞队列 workQueue 中最老的一个任务,并将新任务加入

老规矩,看下各自的源码:

四种拒绝策略是相互独立无关的,选择何种策略去执行,还得结合具体的业务场景。实际工作中,一般直接使用 ExecutorService 很多时候,都是使用的默认的 defaultHandler ,也即 AbortPolicy 策略,抛出异常。

二、线程池的四种创建方式及区别

1.newCachedThreadPool

可缓存线程池,创建线程数量没有限制,可以灵活回收线程,如果设置线程空闲时间1分钟,则该工作线程自动终止,终止后提交了新任务,就会再重新建立一个线程。缺点是在使用CachedThreadPool时,一定要注意控制任务的数量,否则,由于大量线程同时运行,很有会造成系统瘫痪。核心线程数为0,非核心线程数为MAX_VALUE,队列不存储值,总认为队列是满的,所以每次执行任务时都会创建非核心线程,非核心线程空闲了超过60秒(默认),就会自动回收。

2.newfixedThreadPool

创建定长的线程池,在达到长度之前,每提交一个任务都会创建一个线程,如果达到线程池最大数量,则提交到队列中,在空闲的时候也不会自动回收线程,核心线程数为参数传入,非核心线程数和核心线程数一样,队列为无界队列,资源有限的时候容易引起OOM.
与newSingledThreadPool 不同的是核心线程数不为1.

3.newSingleThreadExecutor

创建单一线程执行。只有一个线程按顺序执行任务,如果这个线程出现异常结束,会有另一个线程取代并按顺序执行。corepoolsize 核心线程数为1 ,非核心线程数为1 ,队列为无界队列,单工作线程最大的特点是可保证顺序地执行各个任务,并且在任意给定的时间不会有多个线程是活动的。

4.newScheduledThreadPool

创建一个定长的线程池,而且支持定时的以及周期性的任务执行,支持定时及周期性任务执行。如果延迟3秒执行或每隔3秒执行一次核心线程数为 参数设定,非核心线程数为MAX_VALUE,定义了一个DelayedWorkQueue,它是一个有序队列,会通过每个任务按照距离下次执行时间间隔的大小来排序;

三、线程池总结

Java 中线程池是运用场景最多的并发框架,几乎所有需要异步或并发执行任务的程序都可以使用线程池。合理地用线程池可以带来多个好处:

(1)降低资源消耗。通过重复利用已创建的线程降低线程在创建和销毁时造成的消耗。

(2)提高响应速度。当处理执行任务时,任务可以不需要等待线程的创建就能立刻执行。

​ (3)提高线程的可管理性。线程是稀缺资源,如果无限制地创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一分配、调优和监控。

绝大多数场景,线程池需要自定义来使用,线程池的参数需要根据处理任务的情况来合理分配,比如IO密集型任务就可以多增加一下一些核心线程,而计算密集型增加线程数量会适得其反。具体的参数需要进行压测、调整,再压测再调整,达到一个合理的范围。


这篇文章就到这,线程池的解析系列文章已经讲完,其他文章请翻看合集。

如果你觉得此文对你有一丁点帮助,点个赞,关个注,不失联,还希望补充什么内容,大家在评论区留言,期待后续精彩内容。

微信搜索关注订阅号:马老司,学习更多技术点

展开阅读全文

页面更新:2024-03-23

标签:线程   定长   策略   都会   队列   异常   数量   核心   参数   文章

1 2 3 4 5

上滑加载更多 ↓
推荐阅读:
友情链接:
更多:

本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828  

© CopyRight 2020-2024 All Rights Reserved. Powered By 71396.com 闽ICP备11008920号-4
闽公网安备35020302034903号

Top