APP下载

Executor的使用

消息来源:baojiabao.com 作者: 发布时间:2026-05-28

报价宝综合消息Executor的使用

在上一篇我们简单的介绍了执行绪池的使用,虽然执行绪池比我们直接使用原始的执行绪类更加方便,但在建立执行绪池物件时对引数的设定是需要开发人员精心考量的,否则执行绪池并不会实现我们满意的效果。在实际的开发中,我们用的最多的执行绪框架其实不是执行绪池而是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-12-02 23:53:00

相关文章