iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >ThreadPoolExecutor参数如何使用
  • 473
分享到

ThreadPoolExecutor参数如何使用

2023-07-05 12:07:52 473人浏览 八月长安
摘要

本篇内容主要讲解“ThreadPoolExecutor参数如何使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“ThreadPoolExecutor参数如何使用”吧!ThreadPoolExec

本篇内容主要讲解“ThreadPoolExecutor参数如何使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“ThreadPoolExecutor参数如何使用”吧!

    ThreadPoolExecutor参数说明

    一、ThreadPoolExecutor核心参数说明

    1、corePoolSize:核心线程数

    * 核心线程会一直存活,及时没有任务需要执行

    * 当线程数小于核心线程数时,即使有线程空闲,线程池也会优先创建新线程处理

    * 设置allowCoreThreadTimeout=true(默认false)时,核心线程会超时关闭

    2、queueCapacity:任务队列容量(阻塞队列)

    * 当核心线程数达到最大时,新任务会放在队列中排队等待执行

    3、maxPoolSize:最大线程数

    * 当线程数>=corePoolSize,且任务队列已满时。线程池会创建新线程来处理任务

    * 当线程数=maxPoolSize,且任务队列已满时,线程池会拒绝处理任务而抛出异常

    4、 keepAliveTime:线程空闲时间

    * 当线程空闲时间达到keepAliveTime时,线程会退出,直到线程数量=corePoolSize

    * 如果allowCoreThreadTimeout=true,则会直到线程数量=0

    5、allowCoreThreadTimeout:允许核心线程超时

    6、rejectedExecutionHandler:任务拒绝处理器

    * 两种情况会拒绝处理任务:

    • - 当线程数已经达到maxPoolSize,切队列已满,会拒绝新任务

    • - 当线程池被调用shutdown()后,会等待线程池里的任务执行完毕,再shutdown。如果在调用shutdown()和线程池真正shutdown之间提交任务,会拒绝新任务

    * 线程池会调用rejectedExecutionHandler来处理这个任务。如果没有设置默认是AbortPolicy,会抛出异常

    * ThreadPoolExecutor类有几个内部实现类来处理这类情况:

    • - AbortPolicy 丢弃任务,抛运行时异常

    • - CallerRunsPolicy 执行任务

    • - DiscardPolicy 忽视,什么都不会发生

    • - DiscardOldestPolicy 从队列中踢出最先进入队列(最后一个执行)的任务

    * 实现RejectedExecutionHandler接口,可自定义处理器

    二、ThreadPoolExecutor执行顺序

    线程池按以下行为执行任务

    当线程数小于核心线程数时,创建线程。

    当线程数大于等于核心线程数,且任务队列未满时,将任务放入任务队列。

    当线程数大于等于核心线程数,且任务队列已满

    • -1 若线程数小于最大线程数,创建线程

    • -2 若线程数等于最大线程数,抛出异常,拒绝任务

    三、ThreadPoolExecutor如何设置参数

    默认值

    * corePoolSize=1 * queueCapacity=Integer.MAX_VALUE * maxPoolSize=Integer.MAX_VALUE * keepAliveTime=60s * allowCoreThreadTimeout=false * rejectedExecutionHandler=AbortPolicy()

    如何来设置

    * 需要根据几个值来决定

    • - tasks :每秒的任务数,假设为1000

    • - taskcost:每个任务花费时间,假设为0.1s

    • - responsetime:系统允许容忍的最大响应时间,假设为1s

    * 做几个计算

    - corePoolSize = 每秒需要多少个线程处理?

    * 一颗CPU核心同一时刻只能执行一个线程,然后操作系统切换上下文,核心开始执行另一个线程的代码,以此类推,超过cpu核心数,就会放入队列,如果队列也满了,就另起一个新的线程执行,所有推荐:corePoolSize = ((cpu核心数 * 2) + 有效磁盘数),java可以使用Runtime.getRuntime().availableProcessors()获取cpu核心数

    - queueCapacity = (coreSizePool/taskcost)*responsetime

    * 计算可得 queueCapacity = corePoolSize/0.1*1。意思是队列里的线程可以等待1s,超过了的需要新开线程来执行

    * 切记不能设置为Integer.MAX_VALUE,这样队列会很大,线程数只会保持在corePoolSize大小,当任务陡增时,不能新开线程来执行,响应时间会随之陡增。

    - maxPoolSize = (max(tasks)- queueCapacity)/(1/taskcost)

    * 计算可得 maxPoolSize = (1000-corePoolSize)/10,即(每秒并发数-corePoolSize大小) / 10

    * (最大任务数-队列容量)/每个线程每秒处理能力 = 最大线程数

    • - rejectedExecutionHandler:根据具体情况来决定,任务不重要可丢弃,任务重要则要利用一些缓冲机制来处理

    • - keepAliveTime和allowCoreThreadTimeout采用默认通常能满足

    ThreadPoolExecutor参数allowCoreThreadTimeOut

    ThreadPoolExecutor的执行流程有一点可能被吐槽过,就是只有缓存队列已经满了的时候才会使用到maxPoolSize创建新的线程.也就是说如果corePoolSize设为0的时候,要等到队列满了,才会创建线程去执行任务

    之前有被问到,希望没有任务的时候线程池里的线程可以停掉。可能对性能和资源有过考虑的人都会想到这个问题吧

    今天看jdk源码的时候发现了ThreadPoolExecutor在1.6的时候已经支持了

    allowCoreThreadTimeOut参数就是为此设计的

            public void allowCoreThreadTimeOut(boolean value) {        if (value && keepAliveTime <= 0)            throw new IllegalArgumentException("Core threads must have nonzero keep alive times");        if (value != allowCoreThreadTimeOut) {            allowCoreThreadTimeOut = value;            if (value)                interruptIdleWorkers();        }    }

    在ThreadPoolExecutor构造函数的注释上也有明确说明:corePoolSize 的数量会一直保持,即使这些线程是空闲的,除非设置了allowCoreThreadTimeOut

        public ThreadPoolExecutor(int corePoolSize,                              int maximumPoolSize,                              long keepAliveTime,                              TimeUnit unit,                              BlockingQueue<Runnable> workQueue) {        this(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue,             Executors.defaultThreadFactory(), defaultHandler);    }

    当然,在Executors的静态工厂里面的newCachedThreadPool提供了另外一种思路

    coreSize为0SynchronousQueue最多只能有一个任务在队列里面

    也就是说这个线程池的任务会被立即分配一个线程去处理,如果没有空闲的线程会立即创建线程。

    在空闲的时候,线程数量会减少直至为0,这一点倒是满足了要求。可是队列中最多只会缓存一个任务,当任务的处理速度慢于任务进入线程池的速度时,线程数量就会不断膨胀。如果maxPoolSize设置成一个比较小的数字时,可能就会有大量任务被拒绝策略处理。

    所以正如注释中所说,newCachedThreadPool只适合于任务处理速度很快的场景下。比如做一些计算,不需要依赖其它服务

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

    到此,相信大家对“ThreadPoolExecutor参数如何使用”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

    --结束END--

    本文标题: ThreadPoolExecutor参数如何使用

    本文链接: https://www.lsjlt.com/news/351634.html(转载时请注明来源链接)

    有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

    本篇文章演示代码以及资料文档资料下载

    下载Word文档到电脑,方便收藏和打印~

    下载Word文档
    猜你喜欢
    • ThreadPoolExecutor参数如何使用
      本篇内容主要讲解“ThreadPoolExecutor参数如何使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“ThreadPoolExecutor参数如何使用”吧!ThreadPoolExec...
      99+
      2023-07-05
    • ThreadPoolExecutor参数的用法及说明
      目录ThreadPoolExecutor参数说明一、ThreadPoolExecutor核心参数说明二、ThreadPoolExecutor执行顺序三、ThreadPoolExecu...
      99+
      2023-03-14
      ThreadPoolExecutor参数 ThreadPoolExecutor参数用法 ThreadPoolExecutor参数说明
    • 如何在Java中使用ThreadPoolExecutor
      本篇文章给大家分享的是有关如何在Java中使用ThreadPoolExecutor,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。一、前言线程池主要由以下4个核心组件组成。线程池...
      99+
      2023-06-15
    • java并发ThreadPoolExecutor如何使用
      这篇文章主要介绍“java并发ThreadPoolExecutor如何使用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“java并发ThreadPoolExecutor如何使用”文章能帮助大家解决问...
      99+
      2023-07-05
    • MySQL参数如何使用
      这篇文章将为大家详细讲解有关MySQL参数如何使用,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。  MySQL参数怎么使用  createtable的时候,...
      99+
      2024-04-02
    • 如何使用ADO.NET参数
      这篇文章将为大家详细讲解有关如何使用ADO.NET参数,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。在数据驱动的应用程序中,存储过程具有许多优势。通过利用存储过程,数据库操作可以封装在单个命令中,为获取*...
      99+
      2023-06-17
    • python线程池ThreadPoolExecutor,传单个参数和多个参数方式
      目录python线程池ThreadPoolExecutor,传单个参数和多个参数这是线程池传单个参数的下面是传多个参数的python线程池传入多个参数 ThreadPoolExecu...
      99+
      2023-03-14
      python线程池 python ThreadPoolExecutor python传单个参数 python传多个参数
    • python线程池ThreadPoolExecutor怎么传单个参数和多个参数
      这篇文章主要介绍了python线程池ThreadPoolExecutor怎么传单个参数和多个参数的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇python线程池ThreadPoolExecutor怎么传单个参数...
      99+
      2023-07-05
    • 如何使用 PHP 函数的参数?
      函数参数允许向函数传递数据,有两种传递方式:按值传递:原始变量不受函数修改影响。按引用传递(以 &amp;amp; 符号开头):函数修改会影响原始变量。实战案例:表单验证中,按值...
      99+
      2024-04-15
      参数 php
    • 如何使用Xcopy命令参数
      本篇内容介绍了“如何使用Xcopy命令参数”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!XCOPY是COPY的扩展,可以把指定的目录连文件和...
      99+
      2023-06-08
    • 如何使用C++缺省参数
      这篇文章将为大家详细讲解有关如何使用C++缺省参数,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。一、缺省参数概念缺省参数是声明或定义函数时为函数的参数指定一个默认值。在调用该函数时,如果没有...
      99+
      2023-06-26
    • Spring:如何使用枚举参数
      目录 枚举参数确认需求定义枚举Converter 和 ConverterFactory加载配置测试总结 枚举参数 接口开发过程中不免有表示类型的参数,比如 0 表...
      99+
      2024-04-02
    • 如何使用OLEDBCommand传递参数
      使用OLEDBCommand传递参数的步骤如下:1. 创建一个OLEDBConnection对象并打开连接:```OleDbConn...
      99+
      2023-09-28
      参数
    • 如何使用批处理参数
      这篇文章给大家分享的是有关如何使用批处理参数的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。可以在批处理文件内的任何地方使用批处理参数,以提取有关环境设置的信息。 Cmd.exe 提供批处理参数扩展变量(...
      99+
      2023-06-09
    • C++中如何使用CreateThread参数
      本篇文章为大家展示了C++中如何使用CreateThread参数,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。先定义要传递的C++ CreateThread参数结构体:typedef st...
      99+
      2023-06-17
    • VB.NET如何使用可选参数
      这篇文章主要为大家展示了“VB.NET如何使用可选参数”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“VB.NET如何使用可选参数”这篇文章吧。VB.NET作为微软推出的一款基于面向对象的编程语言...
      99+
      2023-06-17
    • 浅谈Java ThreadPoolExecutor的使用
      目录一、前言二、ThreadPoolExecutor三、构造函数参数解析四、总结一、前言 线程池主要由以下4个核心组件组成。 线程池管理器:用于创建并管理线程池 工...
      99+
      2024-04-02
    • ThreadPoolExecutor参数含义及源码执行流程详解
      目录背景典型回答考点分析知识拓展execute() VS submit()线程池的拒绝策略自定义拒绝策略ThreadPoolExecutor 扩展小结背景 线程池是为了避免线程频繁的...
      99+
      2022-11-13
      ThreadPoolExecutor执行流程 ThreadPoolExecutor参数
    • javascript不定数量参数如何使用
      今天小编给大家分享一下javascript不定数量参数如何使用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。在 Javasc...
      99+
      2023-07-06
    • 如何使用 PHP 可变函数参数传递多个参数?
      php可变函数参数传递多个参数的方式如下:使用[...]运算符声明函数,该运算符指示函数可以接收任意数量的参数。使用的语法的形式为:function my_function(...$ar...
      99+
      2024-04-10
      php 可变函数参数
    软考高级职称资格查询
    编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
    • 官方手机版

    • 微信公众号

    • 商务合作