• 线程池ThreadPoolExecutor参数设置


    一、概述

    DK1.5中引入了强大的concurrent包,其中最常用的莫过了线程池的实现ThreadPoolExecutor,它给我们带来了极大的方便,但同时,对于该线程池不恰当的设置也可能使其效率并不能达到预期的效果,甚至仅相当于或低于单线程的效率。

    ThreadPoolExecutor类可设置的参数主要有:

    corePoolSize
    核心线程数,核心线程会一直存活,即使没有任务需要处理。当线程数小于核心线程数时,即使现有的线程空闲,线程池也会优先创建新线程来处理任务,而不是直接交给现有的线程处理。

    核心线程在allowCoreThreadTimeout被设置为true时会超时退出,默认情况下不会退出。

    maxPoolSize
    当线程数大于或等于核心线程,且任务队列已满时,线程池会创建新的线程,直到线程数量达到maxPoolSize。如果线程数已等于maxPoolSize,且任务队列已满,则已超出线程池的处理能力,线程池会拒绝处理任务而抛出异常。
    keepAliveTime
    当线程空闲时间达到keepAliveTime,该线程会退出,直到线程数量等于corePoolSize。如果allowCoreThreadTimeout设置为true,则所有线程均会退出直到线程数量为0。

    allowCoreThreadTimeout
    是否允许核心线程空闲退出,默认值为false。

    queueCapacity
    任务队列容量。从maxPoolSize的描述上可以看出,任务队列的容量会影响到线程的变化,因此任务队列的长度也需要恰当的设置。


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

    当线程数小于核心线程数时,创建线程。
    当线程数大于等于核心线程数,且任务队列未满时,将任务放入任务队列。
    当线程数大于等于核心线程数,且任务队列已满
    若线程数小于最大线程数,创建线程
    若线程数等于最大线程数,抛出异常,拒绝任务

    系统负载

    参数的设置跟系统的负载有直接的关系,下面为系统负载的相关参数:

    tasks,每秒需要处理的最大任务数量
    tasktime,处理第个任务所需要的时间
    responsetime,系统允许任务最大的响应时间,比如每个任务的响应时间不得超过2秒。

    二、说细参数设置说明

    1、默认值
        * corePoolSize=1
        * queueCapacity=Integer.MAX_VALUE
        * maxPoolSize=Integer.MAX_VALUE
        * keepAliveTime=60s
        * allowCoreThreadTimeout=false
        * rejectedExecutionHandler=AbortPolicy()
    
    2、如何来设置
       * 需要根据几个值来决定
           - tasks :每秒的任务数,假设为500~1000
           - taskcost:每个任务花费时间,假设为0.1s
           - responsetime:系统允许容忍的最大响应时间,假设为1s
       * 做几个计算
           - corePoolSize = 每秒需要多少个线程处理? 
             * threadcount = tasks/(1/taskcost) =tasks*taskcout =  (500~1000)*0.1 = 50~100 个线程。
           corePoolSize设置应该大于50 * 根据8020原则,如果80%的每秒任务数小于800,那么corePoolSize设置为80即可 - queueCapacity = (coreSizePool/taskcost)*responsetime * 计算可得 queueCapacity = 80/0.1*1 = 80。意思是队列里的线程可以等待1s,超过了的需要新开线程来执行 * 切记不能设置为Integer.MAX_VALUE,这样队列会很大,线程数只会保持在corePoolSize大小
          ,当任务陡增时,不能新开线程来执行,响应时间会随之陡增。 - maxPoolSize = (max(tasks)- queueCapacity)/(1/taskcost) * 计算可得 maxPoolSize = (1000-80)/10 = 92 * (最大任务数-队列容量)/每个线程每秒处理能力 = 最大线程数 - rejectedExecutionHandler:根据具体情况来决定,任务不重要可丢弃,任务重要则要利用一些缓冲机制来处理 - keepAliveTimeallowCoreThreadTimeout采用默认通常能满足 3 以上都是理想值,实际情况下要根据机器性能来决定。如果在未达到最大线程数的情况机器cpu load已经满了
        ,则需要通过升级硬件(呵呵)和优化代码,降低taskcost来处理。

    以上关于线程数量的计算并没有考虑CPU的情况。若结合CPU的情况,比如,当线程数量达到50时,CPU达到100%,则将maxPoolSize设置为60也不合适,此时若系统负载长时间维持在每秒1000个任务,则超出线程池处理能力,应设法降低每个任务的处理时间(tasktime)。
     

  • 相关阅读:
    U盘安装WIN10专业版
    jquery template模版引擎
    MySQL大数据量快速分页实现(转载)
    MySQL for Windows 解压缩版安装 和 多实例安装
    macbook 重装win7
    MySQL for Visual Studio Version
    VS2010中没有ado.net entity data model实体数据模型这一选项-解决办法
    修改server 2008远程桌面端口
    懒加载
    html-css 常用
  • 原文地址:https://www.cnblogs.com/liyanbofly/p/15774765.html
Copyright © 2020-2023  润新知