前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Executor的使用

Executor的使用

作者头像
吉林乌拉
发布2019-08-14 17:50:45
4340
发布2019-08-14 17:50:45
举报
文章被收录于专栏:吉林乌拉吉林乌拉

在上一篇我们简单的介绍了线程池的使用,虽然线程池比我们直接使用原始的线程类更加方便,但在创建线程池对象时对参数的设置是需要开发人员精心考量的,否则线程池并不会实现我们满意的效果。在实际的开发中,我们用的最多的线程框架其实不是线程池而是Executor。它为我们创建一个线程池提供了更方便的方法。Executor是一个接口,它是Executor框架的基础,它使任务的提交与任务的执行分离。底层仍然使用的是线程池。通过Executor框架的工具类Executors,可以创建3种类型的线程池它们分别是:FixedThreadPool、SingleThreadExecutor、CachedThreadPool。下面我们分别看一下它们之间的区别。

FixedThreadPool:可重用固定线程数的线程池。

我们从源码中可以看出newFixedThreadPool()方法将线程池中的初始化的线程数和允许最大的线程数都设置成了参数值。也就是说我们参数传递的是多少就同时有多少个线程在同时执行。并且它又创建了LinkedBlockingQueue来实现线程池中的队列服务。我们知道LinkedBlockingQueue是一个无界队列,也就是说它可以存储很多个线程任务,当线程池中的并发任务大于线程池中允许的最大数时,就会将任务保存到此队列中。当有线程执行完毕后,线程池在从队列中取出相应的任务去执行。并且我发们发现newFixedThreadPool()方法中已经将keepAliveTime设置为0,目的是如果有线程执行完任务后,要求立即终止。

SingleThreadExecutor:单个线程的线程池。

我们看出SingleThreadExecutor()和newFixedThreadPool()方法几乎一样,只是设置了线程池的初始化线程数和允许的最大线程数都是1。执行的过程和上诉的逻辑一样。

CachedThreadPool:根据需要创建新线程的线程池。

我们看CachedThreadPool()将corePool设置为0,把maximumPoolSize设置最Integer.MAX_VALUE。意思是在创建这个线程池时,没有初始化空闲线程,而是如果有任务添加,那么它就会创建一个新线程。

下面我们看一下具体的代码。

FixedThreadPool

因为我们只创建了2个线程,所以这个线程池的最大并发数就是2,所以任务一任务二是先同时输出的,任务三是后输出的。因为任务三被添加到了队列中,只有其它任务执行完,才会执行队列中的任务。

SingleThreadExecutor

因为SingleThreadExecutor线程池最大的并发数是1,所以当我们提交3个任务时,只有一个会执行另外两个会被添加到队列中,所以执行的结果显示只有一个线程。

CachedThreadPool

我们知道CachedThreadPool线程池中初始化的空闲线程是0,但是它允许的最大线程数是Integer.MAX_VALUE也就相当于无限大。所以我们在提交任务时,因为没有超过允许的最大线程数所以线程池就会为我们创建一个新线程。所以任务一任务二任务三都是并行执行的。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-06-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 吉林乌拉 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档