线程池参数详解

转载来自:http://blog.csdn.net/zhouhl_cn/article/details/7392607 和http://www.cnblogs.com/dolphin0520/p/3932921.html


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

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

  • corePoolSize

在创建了线程池后,默认情况下,线程池中并没有任何线程,而是等待有任务到来才创建线程去执行任务,(除非调用了prestartAllCoreThreads()或者prestartCoreThread()方法,从这2个方法的名字就可以看出,是预创建线程的意思,即在没有任务到来之前就创建corePoolSize个线程或者一个线程)。

默认情况下,在创建了线程池后,线程池中的线程数为0,当有任务来之后,就会创建一个线程去执行任务,当线程池中的线程数目达到corePoolSize后,就会把到达的任务放到缓存队列当中。核心线程在allowCoreThreadTimeout被设置为true时会超时退出,默认情况下不会退出。

  • maxPoolSize
当线程数大于或等于核心线程,且任务队列已满时,线程池会创建新的线程,直到线程数量达到maxPoolSize。如果线程数已等于maxPoolSize,且任务队列已满,则已超出线程池的处理能力,线程池会拒绝处理任务而抛出异常。
  • keepAliveTime

当线程空闲时间达到keepAliveTime,该线程会退出,直到线程数量等于corePoolSize。如果allowCoreThreadTimeout设置为true,则所有线程均会退出直到线程数量为0。

  • allowCoreThreadTimeout

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

  • queueCapacity

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


还有就是 workQueue:一个阻塞队列,用来存储等待执行的任务,这个参数的选择也很重要,会对线程池的运行过程产生重大影响,一般来说,这里的阻塞队列有以下几种选择:

ArrayBlockingQueue;
LinkedBlockingQueue;
SynchronousQueue;
PriorityBlockingQueue 
ArrayBlockingQueue和PriorityBlockingQueue使用较少,一般使用LinkedBlockingQueue和Synchronous。线程池的排队策略与BlockingQueue有关。
  • threadFactory:线程工厂,主要用来创建线程;
  • handler:表示当拒绝处理任务时的策略,有以下四种取值:
ThreadPoolExecutor.AbortPolicy:丢弃任务并抛出RejectedExecutionException异常。 
ThreadPoolExecutor.DiscardPolicy:也是丢弃任务,但是不抛出异常。 
ThreadPoolExecutor.DiscardOldestPolicy:丢弃队列最前面的任务,然后重新尝试执行任务(重复此过程)
ThreadPoolExecutor.CallerRunsPolicy:由调用线程处理该任务 

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

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

系统负载

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

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


参数设置


corePoolSize:

每个任务需要tasktime秒处理,则每个线程每钞可处理1/tasktime个任务。系统每秒有tasks个任务需要处理,则需要的线程数为:tasks/(1/tasktime),即tasks*tasktime个线程数。假设系统每秒任务数为100~1000,每个任务耗时0.1秒,则需要100*0.1至1000*0.1,即10~100个线程。那么corePoolSize应该设置为大于10,具体数字最好根据8020原则,即80%情况下系统每秒任务数,若系统80%的情况下第秒任务数小于200,最多时为1000,则corePoolSize可设置为20。


queueCapacity:

任务队列的长度要根据核心线程数,以及系统对任务响应时间的要求有关。队列长度可以设置为(corePoolSize/tasktime)*responsetime: (20/0.1)*2=400,即队列长度可设置为400。

队列长度设置过大,会导致任务响应时间过长,切忌以下写法:

LinkedBlockingQueue queue = new LinkedBlockingQueue();

这实际上是将队列长度设置为Integer.MAX_VALUE,将会导致线程数量永远为corePoolSize,再也不会增加,当任务数量陡增时,任务响应时间也将随之陡增。


maxPoolSize:

当系统负载达到最大值时,核心线程数已无法按时处理完所有任务,这时就需要增加线程。每秒200个任务需要20个线程,那么当每秒达到1000个任务时,则需要(1000-queueCapacity)*(20/200),即60个线程,可将maxPoolSize设置为60。


keepAliveTime:

线程数量只增加不减少也不行。当负载降低时,可减少线程数量,如果一个线程空闲时间达到keepAliveTiime,该线程就退出。默认情况下线程池最少会保持corePoolSize个线程。


allowCoreThreadTimeout:

默认情况下核心线程不会退出,可通过将该参数设置为true,让核心线程也退出。


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


转载于:https://www.cnblogs.com/duende99/p/11488569.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/461408.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LeetCode20——Valid Parentheses(括号匹配问题,使用栈的知识)

题目&#xff1a; 解法&#xff1a; #include <stack>class Solution { public:bool isValid(string s) {stack<char> paren;for (char& c : s) {switch (c) {case (: case {: case [: paren.push(c);break;case ): if (paren.empty() || paren.top()!() retur…

文本框输入怎么样让键盘消失

把View 类改成UIControl 给View加onTouchDown事件 /* *点击空白处让键盘消失 */ - (IBAction)onTouchDownEvent:(id)sender { [tf1 resignFirstResponder]; [tf2 resignFirstResponder]; } 转载于:https://www.cnblogs.com/skyblue/archive/2013/01/25/2877012.html

取周一时间_周一到周五不好化妆?别着急,5款夏日通勤裸妆的教程来了!

化妆已经成为了许多女生每天的必修课&#xff0c;好的妆容不仅可以让自己显得有精神还可以增添自己的自信。但是每天早上起来&#xff0c;能够化妆的时间又不多&#xff0c;所以只好每天都重复同一样妆容&#xff0c;快速便捷&#xff0c;时间久了就渐渐感觉了无生趣。尤其是周…

LeetCode22——Generate Parentheses(给定n对括号,然后看有多少正确的括号组合)

题目&#xff1a; 解法&#xff1a; The idea is intuitive. Use two integers to count the remaining left parenthesis (n) and the right parenthesis (m) to be added. At each function call add a left parenthesis if n >0 and add a right parenthesis if m>0.…

win10 Snipaste 截图软件

安装教程&#xff1a;搜索 snipaste&#xff0c;网上可以直接下载使用教程&#xff1a; 1&#xff09;截图按钮&#xff1a;F1 2&#xff09;粘贴按钮&#xff1a;F3转载于:https://www.cnblogs.com/duende99/p/11489559.html

docker安装mysql_Docker 安装 MySQL

本篇将介绍如何使用 Docker 部署 MySQL 数据库及远程访问配置。安装 MySQL拉取镜像使用下面的命令拉取 MySQL 数据库的镜像&#xff1a;$ sudo docker pull mysql # 拉取最新版本的镜像&#xff0c;当前为 MySQL 8 版本&#xff0c;tag 为 latest$ sudo docker pull mysql:5.7…

SurfaceView闪烁问题

SurfaceView是frontbuffer和backbuffer交替显示的&#xff0c;每次Post交替一次&#xff0c;按你这样写两个Buffer是不一样的所有奇数的Post画在一起&#xff0c;偶数的画在另外个Buffer&#xff0c;运行起来就会闪了。延时长一点就看的出来了。应用上加缓冲就可以了。 1234567…

图片预加载

function loadImage(url, callback) {if(url!null) {var img new Image();img.src url;if(img.complete) {callback(img);} else {img.onload function(){img.onload null;callback(img);} }} }loadImage(pic_url,loadImage);转载于:https://www.cnblogs.com/hitbs228/p/3…

RSA加密-解密以及解决超长内容加密失败解决

加解密&#xff08;没有使用到证书&#xff09;&#xff1a;https://blog.csdn.net/qy20115549/article/details/83105736生成证书网站&#xff1a;https://blog.csdn.net/u012191627/article/details/80990066解决超长内容加密失败解决方案&#xff08;台湾&#xff09;&#…

java的import和python的import对比_import导入的是什么

Q1&#xff1a;from import导入出错,单独导入则正确..您好&#xff0c; from UserDict import UserDict它与你所熟知的 import module 语法很相似&#xff0c;但是有一个重要的区别&#xff1a;UserDict 被直接导入到局部名字空间去了&#xff0c;所以它可以直接使用&#xff0…

LeetCode17——Letter Combinations of a Phone Number(手机几个按键对应的字母(符号)组合)

题目&#xff1a; 解法&#xff1a; Simple and efficient iterative solution. Explanation with sample input "123" Initial state: result {""} Stage 1 for number "1": result has {""}candiate is "abc"generate …

[转载]ext4的noatime

默认的方式下linux会把文件访问的时间atime做记录&#xff0c;这在绝大部分的场合都是没有必要的&#xff0c;如果遇到机器IO负载高或是CPU WAIT高的情况&#xff0c;可以尝试使用noatime和nodiratime 1、修改/etc/fstab&#xff0c;类似LABEL/ / …

python人人语音爬虫(登陆尚未完成,需要使用先登录在查cookie中的t)

2019独角兽企业重金招聘Python工程师标准>>> import urllib, urllib2, cookielib,re,jsondef LoginRenren(url,t_cookie):cookie {"t": t_cookie}#cookie中的t需要到浏览器中去查cookie "".join(x "" cookie[x] ";" f…

IDEA将项目打包为指定class文件的jar

转自&#xff1a;https://blog.csdn.net/makang456/article/details/86699375 【背景】 公司最近要和某大公司合作&#xff0c;将本公司的产品提供给其它公司单独部署售卖&#xff0c;为了让产品中重要的服务具备防君子不防小人的作用&#xff0c;于是就写了一个单独的服务…

鼠标点击实现花瓣雨_每周实验 | 黄金雨

点击BNU化学学社快来关注我们吧&#xff01;倩西风染就丹砂。不比黄金雨&#xff0c;灿余霞。送幽梦&#xff0c;到仙家。背景介绍BACKGROUND在开始实验之前&#xff0c;我们先来看一种植物&#xff0c;阿勃勒。它是苏木科决明属的落叶大乔木&#xff0c;花朵是最重要的观赏特征…

Windows系统进程介绍

http://mtoou.info/smss-exe/转载于:https://www.cnblogs.com/Clingingboy/archive/2013/01/29/2882017.html

大规模天线阵列(massive-mimo)的介绍

本文转载于http://www.sohu.com/a/106043955_114877&#xff0c;如有侵权&#xff0c;请告知删除。有删改。 前言 这是最好的时代&#xff0c;也是最坏的时代。 生活在科技大爆发的时代里&#xff0c;你是否感觉到一丝庆幸? 虚拟现实、自动驾驶&#xff0c;无数令人血脉偾张…

联发科mtk和骁龙730哪个好_联发科G90T和骁龙710哪个好?

8月23日消息&#xff0c;小米集团副总裁、Redmi品牌总经理卢伟冰宣布&#xff0c;红米Note 8 Pro搭载全球首款游戏平台联发科G90T&#xff0c;我们称之为“游戏芯”。卢伟冰表示&#xff0c;年轻人每天很多时间花在游戏上&#xff0c;对于游戏手机来说&#xff0c;先抛开其他电…

天文学中常用的坐标系

四种常用的坐标系 1、地平坐标系 简而言之&#xff0c;在地球圈上&#xff0c;观测者所在的点的切面和天球相交&#xff0c;得到的交线圈为地平圈。地心和观测者所在点的连线和天球的交点为天顶&#xff0c;反向延长线与天球的交点为天底。 通过北天极和天顶的经圈和地平圈有两…

lightswitch 添加 TreeView 控件

代码片段 <UserControl xmlns:sdk"http://schemas.microsoft.com/winfx/2006/xaml/presentation/sdk" x:Class"LightSwitchApplication.TreeViewControl.DepartmentTreeViewControl"xmlns"http://schemas.microsoft.com/winfx/2006/xaml/presenta…