栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

请介绍一下 ThreadPoolExecutor 类?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

请介绍一下 ThreadPoolExecutor 类?

线程池实现类

ThreadPoolExecutor
Executor
框架最核心的类。**

ThreadPoolExecutor 类分析

ThreadPoolExecutor
类中提供的四个构造方法。我们来看最长的那个,其余三个都是在这个构造方法的基础上产生(其他几个构造方法说白点都是给定某些默认参数的构造方法比如默认制定拒绝策略是什么),这里就不贴代码讲了,比较简单。

        public ThreadPoolExecutor(int corePoolSize,//线程池的核心线程数量        int maximumPoolSize,//线程池的最大线程数        long keepAliveTime,//当线程数大于核心线程数时,多余的空闲线程存活的最长时间        TimeUnit unit,//时间单位        BlockingQueue workQueue,//任务队列,用来储存等待执行任务的队列        ThreadFactory threadFactory,//线程工厂,用来创建线程,一般默认即可        RejectedExecutionHandler handler//拒绝策略,当提交的任务过多而不能及时处理时,我们可以定制策略来处理任务         ) {        if (corePoolSize < 0 || maximumPoolSize <= 0 || maximumPoolSize < corePoolSize || keepAliveTime < 0) throw new IllegalArgumentException();        if (workQueue == null || threadFactory == null || handler == null) throw new NullPointerException();        this.corePoolSize = corePoolSize;        this.maximumPoolSize = maximumPoolSize;        this.workQueue = workQueue;        this.keepAliveTime = unit.tonanos(keepAliveTime);        this.threadFactory = threadFactory;        this.handler = handler;    }

下面这些对创建 非常重要,在后面使用线程池的过程中你一定会用到!所以,务必拿着小本本记清楚。

ThreadPoolExecutor
3 个最重要的参数:

  • corePoolSize
    :
    核心线程数线程数定义了最小可以同时运行的线程数量。
  • maximumPoolSize
    :
    当队列中存放的任务达到队列容量的时候,当前可以同时运行的线程数量变为最大线程数。
  • workQueue
    :
    当新任务来的时候会先判断当前运行的线程数量是否达到核心线程数,如果达到的话,信任就会被存放在队列中。

ThreadPoolExecutor
其他常见参数:

  1. keepAliveTime
    :当线程池中的线程数量大于
    corePoolSize
    的时候,如果这时没有新的任务提交,核心线程外的线程不会立即销毁,而是会等待,直到等待的时间超过了
    keepAliveTime
    才会被回收销毁;
  2. unit
    :
    keepAliveTime
    参数的时间单位。
  3. threadFactory
    :executor 创建新线程的时候会用到。
  4. handler
    :饱和策略。关于饱和策略下面单独介绍一下。

下面这张图可以加深你对线程池中各个参数的相互关系的理解(图片来源:《Java性能调优实战》):

ThreadPoolExecutor
饱和策略定义:

如果当前同时运行的线程数量达到最大线程数量并且队列也已经被放满了任时,

ThreadPoolTaskExecutor
定义一些策略:

  • ThreadPoolExecutor.AbortPolicy
    :抛出
    RejectedExecutionException
    来拒绝新任务的处理。
  • ThreadPoolExecutor.CallerRunsPolicy
    :调用执行自己的线程运行任务,也就是直接在调用
    execute
    方法的线程中运行(
    run
    )被拒绝的任务,如果执行程序已关闭,则会丢弃该任务。因此这种策略会降低对于新任务提交速度,影响程序的整体性能。另外,这个策略喜欢增加队列容量。如果您的应用程序可以承受此延迟并且你不能任务丢弃任何一个任务请求的话,你可以选择这个策略。
  • ThreadPoolExecutor.DiscardPolicy
    不处理新任务,直接丢弃掉。
  • ThreadPoolExecutor.DiscardOldestPolicy
    此策略将丢弃最早的未处理的任务请求。

举个例子:

Spring 通过

ThreadPoolTaskExecutor
或者我们直接通过
ThreadPoolExecutor
的构造函数创建线程池的时候,当我们不指定
RejectedExecutionHandler
饱和策略的话来配置线程池的时候默认使用的是
ThreadPoolExecutor.AbortPolicy
。在默认情况下,
ThreadPoolExecutor
将抛出
RejectedExecutionException
来拒绝新来的任务 ,这代表你将丢失对这个任务的处理。 对于可伸缩的应用程序,建议使用
ThreadPoolExecutor.CallerRunsPolicy
。当最大池被填满时,此策略为我们提供可伸缩队列。(这个直接查看
ThreadPoolExecutor
的构造函数源码就可以看出,比较简单的原因,这里就不贴代码了。)

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/363920.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号