专栏首页吉林乌拉Executor的使用

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也就相当于无限大。所以我们在提交任务时,因为没有超过允许的最大线程数所以线程池就会为我们创建一个新线程。所以任务一任务二任务三都是并行执行的。

本文分享自微信公众号 - 吉林乌拉(jilinwulacom)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-06-18

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • ThreadPoolExecutor的使用

    ThreadPoolExecutor也就是线程池。它就是Java为我们开发多线程程序时提供的一个开发框架。它可以统一的管理线程的创建、销毁、优化、监控等,在使用...

    吉林乌拉
  • Java中的线程组

    在开发多线程时,可以用ThreadGroup关键字创建一个线程组来方便管理一系列的子线程,线程组可以统一的设置线程的某些属性。

    吉林乌拉
  • wait()方法和notify()方法使用时的注意事项

    我们看程序出线了异常。原因是我们没有添加synchronized关键字,所以线程获取不到锁,而直接抛出的异常。

    吉林乌拉
  • java多线程系列_线程简介(1)

        线程是程序运行的基本执行单元。当操作系统(不包括单线程的操作系统,如微软早期的DOS)在执行一个程序时,会在系统中建立一个进程,而在这个进程中,必须至少...

    Hongten
  • 多线程?怎么用?

    进程是指一个内存中运行的应用程序,每个进程都有自己独立的一块内存空间,一个进程中可以启动多个线程。比如在Windows系统中,一个运行的exe就是一个进程。

    故里
  • 读书笔记《Java并发编程的艺术 - 方腾飞》- Java并发编程

    在Java中, 我们可以通过 priority 属性来设置线程的优先级, 参数为 1 ~ 10 参数越大, 代表优先级越高, 默认的优先级为 5

    lvgo
  • 多线程开发,先学会线程池吧

    在实际开发场景中,我们经常要使用多线程开发应用,比如实现异步操作,或者为了提高程序的效率等等。但是以前我见过有实习生在使用的时候是直接new Runable()...

    java技术爱好者
  • 并发编程面试题汇总

    thinkwon.blog.csdn.net/article/details/104863992

    Java旅途
  • java学习笔记(基础篇)—线程

    线程是程序执行的最小单位,是动态的。 进程是系统进程资源分配和系统调度的最小单位,是动态的。 线程和进程的目的:多任务--->效率高

    chlinlearn
  • Thread方法

    这个方法返回线程的 ID 值,类型为 long。线程的 ID 在线程的整个生命周期中都不变。

    宇宙之一粟

扫码关注云+社区

领取腾讯云代金券