线程池扫盲

举报
西魏陶渊明 发表于 2022/09/25 02:42:59 2022/09/25
【摘要】 作者: 西魏陶渊明 博客: https://blog.springlearn.cn/ (opens new window) 西魏陶渊明 莫笑少年江湖梦,谁不少年梦江湖 [!TIP] 本篇文章通读时间大概3分钟,希望在三分钟内的讲解,对你有所帮助, 一定...

作者: 西魏陶渊明 博客: https://blog.springlearn.cn/ (opens new window)

西魏陶渊明

莫笑少年江湖梦,谁不少年梦江湖

[!TIP] 本篇文章通读时间大概3分钟,希望在三分钟内的讲解,对你有所帮助, 一定要认真看并思考,好了。废话不多数,直接上干货,本节内容我们讲 的是Java的线程池,在讲之前我们首先看一下有哪些线程池,这些线程池 我们不过多讲解,因为我们的关注点是他们是如何实现的,和其运行的原理。

# 一、常用线程池列表

这部分内容,只是帮助你回顾一下线程池的知识,大家重点看方法内的实现

1、构造一个固定线程数目的线程池,配置的corePoolSize与maximumPoolSize大小相同,同时使用了一个无界LinkedBlockingQueue存放阻塞任务,因此多余的任务将存在再阻塞队列,不会由RejectedExecutionHandler处理

public static ExecutorService newFixedThreadPool(int nThreads) {
        return new ThreadPoolExecutor(nThreads, nThreads,
                                      0L, TimeUnit.MILLISECONDS,
                                      new LinkedBlockingQueue<Runnable>());
    }
1 2 3 4 5

2、构造一个缓冲功能的线程池,配置corePoolSize=0,maximumPoolSize=Integer.MAX_VALUE,keepAliveTime=60s,以及一个无容量的阻塞队列 SynchronousQueue,因此任务提交之后,将会创建新的线程执行;线程空闲超过60s将会销毁

public static ExecutorService newCachedThreadPool() {
        return new ThreadPoolExecutor(0, Integer.MAX_VALUE,
                                      60L, TimeUnit.SECONDS,
                                      new SynchronousQueue<Runnable>());
    }
1 2 3 4 5

3、构造一个只支持一个线程的线程池,配置corePoolSize=maximumPoolSize=1,无界阻塞队列LinkedBlockingQueue;保证任务由一个线程串行执行

public static ExecutorService newSingleThreadExecutor() {
        return new FinalizableDelegatedExecutorService
            (new ThreadPoolExecutor(1, 1,
                                    0L, TimeUnit.MILLISECONDS,
                                    new LinkedBlockingQueue<Runnable>()));
    }
1 2 3 4 5 6

4、构造有定时功能的线程池,配置corePoolSize,无界延迟阻塞队列DelayedWorkQueue;有意思的是:maximumPoolSize=Integer.MAX_VALUE,由于DelayedWorkQueue是无界队列,所以这个值是没有意义的

/**
     * Creates a thread pool that can schedule commands to run after a
     * given delay, or to execute periodically.
     * @param corePoolSize the number of threads to keep in the pool,
     * even if they are idle
     * @return a newly created scheduled thread pool
     * @throws IllegalArgumentException if {@code corePoolSize < 0}
     */
    public static ScheduledExecutorService newScheduledThreadPool(int corePoolSize) {
        return new ScheduledThreadPoolExecutor(corePoolSize);
    }

1 2 3 4 5 6 7 8 9 10 11 12

# 二、ThreadPoolExecutor

相信大家从上面的众多线程池中都已经看到了这个类,因为上面的线程池底层的构造都是由这个类创建的,

那么我们就开始研究这个类

/**
 * @since 1.5
 * @author Doug Lea
 */
public class ThreadPoolExecutor extends AbstractExecutorService {
	...
}
1 2 3 4 5 6 7

首先看一下构造方法,关于注释一定要好好看,每个参数都理解了,那么你就弄懂了

/**
     *
     * @param corePoolSize 核心线程池大小
     * @param maximumPoolSize 线程池最大容量
     * @param keepAliveTime 线程池空闲时,线程存活时间
     * @param unit 时间单位
     * @param workQueue 工作队列
	 * @param threadFactory 线程工厂
     * @throws IllegalArgumentException if one of the following holds:<br>
     *         {@code corePoolSize < 0}<br>
     *         {@code keepAliveTime < 0}<br>
     *         {@code maximumPoolSize <= 0}<br>
     *         {@code maximumPoolSize < corePoolSize}
     * @throws NullPointerException if {@code workQueue} is null
     */
      public ThreadPoolExecutor(int corePoolSize,
                                 int maximumPoolSize,
                                 long keepAliveTime,
                                 TimeUnit unit,
                                 BlockingQueue<Runnable> workQueue,
                                 ThreadFactory threadFactory) {
           this(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue,
                threadFactory, defaultHandler);
       }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25

# 三、构造参数详解

参数 说明
corePoolSize 核心的线程数
maximumPoolSize 最大线程池就是说你定义的线程池运行创建的最大线程数量
keepAliveTime 空闲时间回收,当这个时间后还没有任务执行就将线程回收
unit 单位,控制上面时间的单位,可以为秒,或者分钟
workQueue 核心线程都已经去执行任务但是,任务还有,那么久先放到这个队列里,就相当于集合
threadFactory 创建线程用户的线程工厂,里面只有一个方法就是newThread,你可以自定义线程名

上面的文字可能你看的不太明白,小编这里画了一个图,大家仔细看看

这张图是小编之前画的,但是头条压缩了,导致图不太清楚,大家看到字就行了

# 1. 执行顺序

  1. 首先交给核心线程数来执行corePoolSize
  2. 如果核心都用完了,就放到workQueue队列里面
  3. 当队列和核心线程数都满了,就继续创建线程,直到等于maximumPoolSize为止
  4. 当任务已经塞不下了,就开始执行拒绝策略(下一篇讲)

文章来源: springlearn.blog.csdn.net,作者:西魏陶渊明,版权归原作者所有,如需转载,请联系作者。

原文链接:springlearn.blog.csdn.net/article/details/125858064

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。