【源码分析】之 线程池工具类 Executors详解


一、提供了什么功能?

源码中的定义:

该类为ExecutorExecutorServiceScheduledExecutorServiceThreadFactoryCallable类定义了工厂和工具方法。

此类支持以下几种方法:

  • 创建并返回一个配置了常用设置的ExecutorService的方法。
  • 创建并返回一个配置了常用设置的ScheduledExecutorService的方法。
  • 创建并返回一个“包装”的ExecutorService的方法,该方法通过使实现特定的方法不可访问来禁用重新配置。
  • 创建并返回一个将新创建线程设置为已知状态的ThreadFactory的方法。
  • 创建并返回一个Callable的方法,该方法基于其他闭包形式,以便可以在需要Callable的执行方法中使用。

说了这么多的名词,那么这些名词之间的关系是什么?请看下图:
​​​​在这里插入图片描述

二、源码中是怎么实现的?

我们先来看看Executors类的结构:

在这里插入图片描述

1、创建并返回一个配置了常用设置的ExecutorService

newFixedThreadPool()

    /**
     * 创建一个线程池,该线程池重用固定数量的线程,并使用共享的无界队列进行操作。
     * 在任何时候,最多将有 nThreads 个线程处于活动状态以处理任务。
     * 如果在所有线程都处于活动状态时提交了额外的任务,这些任务将等待在队列中,直到有线程可用。
     * 如果在执行过程中任何线程因故障而终止,在关闭之前,如果需要执行后续任务,将会有一个新线程替代它。
     * 线程池中的线程将一直存在,直到显式关闭。 
     *
     * 参数: 
     * nThreads – 线程池中的线程数量 
     *
     * 抛出: 
     * IllegalArgumentException – 如果 nThreads <= 0
     */
    public static ExecutorService newFixedThreadPool(int nThreads) {
   
   
        return new ThreadPoolExecutor(nThreads, nThreads,
                                      0L, TimeUnit.MILLISECONDS,
                                      new LinkedBlockingQueue<Runnable>());
    }

	/**
     * 使用指定线程工厂创建新线程的重载方法
     *
     * 参数:
     * nThreads – 线程池中的线程数量
     * threadFactory – 创建新线程时使用的工厂
     *
     * 抛出:
     * NullPointerException – 如果threadFactory为null
     * IllegalArgumentException – 如果nThreads <= 0
     */
    public static ExecutorService newFixedThreadPool(int nThreads, ThreadFactory threadFactory) {
   
   
        return new ThreadPoolExecutor(nThreads, nThreads,
                                      0L, TimeUnit.MILLISECONDS,
                                      new LinkedBlockingQueue<Runnable>(),
                                      threadFactory);
    }

newSingleThreadExecutor()

	/**
     * 从代码上可以看出,该方法和newFixedThreadPool()大同小异,只有两点不同:
     * 1. 线程池核心线程数不同,newFixedThreadPool的核心线程数是方法入参nThreads,而本方法的核心线程数是1。
     * 2. 本方法在new ThreadPoolExecutor()之外加了一层封装new FinalizableDelegatedExecutorService()。
     *    只提供了本类对接口ExecutorService实现的方法的访问接口,目的是防止ThreadPoolExecutor实例在某些情况下	对线程池配置的修改,
     *    例如:使用setCorePoolSize()重新设置线程池核心线程数
     */
    public static ExecutorService newSingleThreadExecutor() {
   
   
        return new FinalizableDelegatedExecutorService
            (new ThreadPoolExecutor(1, 1,
                                    0L, TimeUnit.MILLISECONDS,
                                    new LinkedBlockingQueue<Runnable>()));
    }
    // 使用指定线程工厂创建新线程的重载方法
    public static ExecutorService newSingleThreadExecutor(ThreadFactory threadFactory) {
   
   
        return new FinalizableDelegatedExecutorService
            (new ThreadPoolExecutor(1, 1,
                                    0L, TimeUnit.MILLISECONDS,
                                    new LinkedBlockingQueue<Runnable>(),
                                    threadFactory));
    }

newCachedThreadPool()

	/**
     * 创建一个线程池,该线程池根据需要创建新线程,但会在可用时重用之前构造的线程。
     * 这些线程池通常会提高执行许多短暂异步任务的程序的性能。
     * 调用execute时,如果有可用的线程,将重用之前构造的线程。
     * 如果没有现有线程可用,将创建一个新线程并添加到池中。
     * 未使用超过六十秒的线程将被终止并从缓存中移除。因此,长时间保持空闲的池不会消耗任何资源。
     * 请注意,可以使用ThreadPoolExecutor构造函数创建具有类似属性但不同细节(例如超时参数)的池。
     *
     */
    public static ExecutorService newCachedThreadPool() {
   
   
        return new ThreadPoolExecutor(0, Integer.MAX_VALUE,
                                      60L, TimeUnit.SECONDS
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Coder.Ren

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值