- 1、本文档共9页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
本文由简悦SimpRead转码,原文地址
在本我们主要学习常见的6种线程池,并详细讲解Java8新增的ForkJoinPool线程池,6种常见的
线程池如下。
FixedThreadPool
CachedThreadPool
ScheduledThreadPool
SingleThreadExecutor
SingleThreadScheduledExecutor
ForkJoinPool
FixedThreadPool
第一种线程池叫作FixedThreadPool,它的线程数和最大线程数是一样的,所以可以把它看作是固
定线程数的线程池,它的特点是线程池中的线程数除了初始阶段需要从0开始增加外,的线程数量
就是固定的,就算任务数超过线程数,线程池也不会再创建的线程来处理任务,而是会把超出线程
处理能力的任务放到任务队列中进行等待。而且就算任务队列满了,到了本该继续增加线程数的时候,
由于它的最大线程数和线程数是一样的,所以也无法再增加新的线程了。
如图所示,线程池有t0~t9,10个线程,它们会不停地执行任务,如果某个线程任务执行完了,就会从
任务队列中获取新的任务继续执行,期间线程数量不会增加也不会减少,始终保持在10个。
CachedThreadPool
第二种线程池是CachedThreadPool,可以称作可缓存线程池,它的特点在于线程数是几乎可以无限增
加的(实际最大可以达到Integer.MAX_VALUE,为2^31-1,这个数非常大,所以基本不可能达到),
而当线程闲置时还可以对线程进行回收。也就是说该线程池的线程数量不是固定不变的,当然它也有一
个用于提交任务的队列,但这个队列是SynchronousQueue,队列的容量为0,实际不任何任
务,它只负责对任务进行中转和传递,所以效率比较高。
当我们提交一个任务后,线程池会判断已创建的线程中是否有空闲线程,如果有空闲线程则将任务直接
指派给空闲线程,如果没有空闲线程,则新建线程去执行任务,这样就做到了动态地新增线程。让我们
举个例子,如下方代码所示。
ExecutorServiceservice=Executors.newCachedThreadPool();
for(inti=0;i1000;i++){
service.execute(newTask(){
});
}
使用for循环提交1000个任务给CachedThreadPool,假设这些任务处理的时间非常长,会发生什么
情况呢?因为for循环提交任务的操作是非常快的,但执行任务却比较耗时,就可能导致1000个任务
都提交完了但第一个任务还没有被执行完,所以此时CachedThreadPool就可以动态的伸缩线程数
量,随着任务的提交,不停地创建1000个线程来执行任务,而当任务执行完,假设没有新的任务
了,那么大量的闲置线程又会造成内存资源的浪费,这时线程池就会检测线
文档评论(0)