性质不同的任务可以交给不同规模的线程池执行。
对于不同性质的任务来说,CPU密集型任务应配置尽可能小的线程,如配置CPU个数+1的线程数,IO密集型任务应配置尽可能多的线程,因为IO操作不占用CPU,不要让CPU闲下来,应加大线程数量,如配置两倍CPU个数+1,而对于混合型的任务,如果可以拆分,拆分成IO密集型和CPU密集型分别处理,前提是两者运行的时间是差不多的,如果处理时间相差很大,则没必要拆分了。
若任务对其他系统资源有依赖,如某个任务依赖数据库的连接返回的结果,这时候等待的时间越长,则CPU空闲的时间越长,那么线程数量应设置得越大,才能更好的利用CPU。
当然具体合理线程池值大小,需要结合系统实际情况,在大量的尝试下比较才能得出,以上只是前人总结的规律。
在这篇
如何合理地估算线程池大小?
文章中发现了一个估算合理值的公式
最佳线程数目 = ((线程等待时间+线程CPU时间)/线程CPU时间 )* CPU数目
比如平均每个线程CPU运行时间为0.5s,而线程等待时间(非CPU运行时间,比如IO)为1.5s,CPU核心数为8,那么根据上面这个公式估算得到:((0.5+1.5)/0.5)*8=32。这个公式进一步转化为:
最佳线程数目 = (线程等待时间与线程CPU时间之比 + 1)* CPU数目
可以得出一个结论:
线程等待时间所占比例越高,需要越多线程。线程CPU时间所占比例越高,需要越少线程。
以上公式与之前的CPU和IO密集型任务设置线程数基本吻合。
并发编程网上的一个问题
高并发、任务执行时间短的业务怎样使用线程池?并发不高、任务执行时间长的业务怎样使用线程池?并发高、业务执行时间长的业务怎样使用线程池?
(1)高并发、任务执行时间短的业务,线程池线程数可以设置为CPU核数+1,减少线程上下文的切换
(2)并发不高、任务执行时间长的业务要区分开看:
a)假如是业务时间长集中在IO操作上,也就是IO密集型的任务,因为IO操作并不占用CPU,所以不要让所有的CPU闲下来,可以适当加大线程池中的线程数目,让CPU处理更多的业务
b)假如是业务时间长集中在计算操作上,也就是计算密集型任务,这个就没办法了,和(1)一样吧,线程池中的线程数设置得少一些,减少线程上下文的切换
(3)并发高、业务执行时间长,解决这种类型任务的关键不在于线程池而在于整体架构的设计,看看这些业务里面某些数据是否能做缓存是第一步,增加服务器是第二步,至于线程池的设置,设置参考(2)。最后,业务执行时间长的问题,也可能需要分析一下,看看能不能使用中间件对任务进行拆分和解耦。
线程池设置多大合适呢?虽然线程池大小的设置受到很多因素影响,但是这里给出一个参考公式:最佳线程数目 = ((线程等待时间+线程CPU时间)/线程CPU时间 )* CPU数目比如平均每个线程CPU运行时...
来自: lieyanhaipo的专栏
一般说来,大家认为线程池的大小经验值应该这样设置:(其中N为CPU的个数)如果是CPU密集型应用,则线程池大小设置为N+1如果是IO密集型应用,则线程池大小设置为2N+1如果一台服务器上只部署这一个应...
来自: 向日葵
参考文档:https://blog.csdn.net/wxy941011/article/details/80879225 https://www.cnblogs.com/dennyz...
来自: yuyeqianhen的博客
在如今的多核处理器时代,多线程技术发挥着巨大的作用,尤其对于大批量处理同类型IO密集型的任务,例如全库全表查找数据时,多线程是提升速度和性能的利器。 近期发布的另一篇文章已经详细介...
来自: 海涛技术漫谈
平常我们经常都会使用到线程池,但是有没考虑过为什么需要使用线程池呢?下面我列举一下问题,大家可以思考一下 1.当前服务器的硬件环境是多少核的CPU,它和线程的关系又是什么? 2.jvm能创建...
来自: 浪子
背景在我们日常业务开发过程中,或多或少都会用到并发的功能。那么在用到并发功能的过程中,就肯定会碰到下面这个问题并发线程池到底设置多大呢?通常有点年纪的程序员或许都听说这样......
来自: qianshanding0708的博客
Jetty默认的线程池初始化大小为8,最大线程数为200,在创建Server时如果没有指定线程池数量,框架会初始化一个QueuedThreadPool。部分代码如下:this._threadPool=...
来自: 机器熊的技术大杂烩
一般需要根据任务的类型来配置线程池大小: 如果是CPU密集型任务,就需要尽量压榨CPU,参考值可以设为 NCPU+1 如果是IO密集型任务,参考值可以设置为2*NCPU 当然,这只是一个参考值...
来自: 沉迷代码无法自拔
《Java并发编程实战》一书中,Brian Goetz和合著者们为线程池大小的优化提供了不少中肯的建议。这非常重要,如果线程池中线程的数量过多,最终它们会竞争稀缺的处理器和内存资源,浪费大量的时间在上...
来自: yuxxz的专栏
原文在[url=http://www.javacodegeeks.com/2012/03/threading-stories-about-robust-thread.html]这里[/url]下面是一...
来自: 疯狂的菠菜
先来讲说线程内存相关的东西,主要有下面几条:进程中的所有的线程共享相同的地址空间。任何声明为static/extern的变量或者堆变量可以被进程内所有的线程读写。一个线程真正拥有的唯一私有储存是处理器...
来自: nancy的专栏
多线程你肯定不陌生,这是很多面试官的必备提问技能,“你知道多线程吗?”,“你对多线程了解多少?”“说一说线程池的参数设置原理”,当然了,这只是初阶的,更高阶的会问你并发,或者一些场景题目,让你自己穿插...
来自: weixin_39683776的博客
看到分布式、高并发、多线程这三个词的时候,很多人是不是都认为分布式=高并发=多线程?当面试官问到高并发系统可以采用哪些手段来解决,或者被问到分布式系统如何解决一致性的问题,是不是一脸懵逼?确实,在一开...
来自: biea92843的博客
线程池的最优大小 ...
来自: weixin_42245374的博客
请大家发表一下关于线程池的观点:(C++) 1。比如在做网络程序,服务端程序,经常会用到线程池技术。请问大家一般用的线程池是自己写的?还是Windows自带的线程池?还是在网上搜的第三方线程池库? 2
线程池究竟设成多大是要看你给线程池处理什么样的任务,任务类型不同,线程池大小的设置方式也是不同的。任务一般可分为:CPU密集型、IO密集型、混合型,对于不同类型的任务需要分配不同大小的线程池。CPU密...
来自: u013161431的博客
线程池合理的线程数你是如何考虑的?这也是之前面试遇到的一个题:1.先看下机器的CPU核数,然后在设定具体参数:System.out.println(Runtime.getRuntime().avail...
来自: weixin_44777693的博客
线程池的大小应该为多少结论:线程等待时间所占比例越高,需要越多线程。线程CPU时间所占比例越高,需要越少线程(防止过多的上下文切换)。 最佳线程数目 = (线程等待时间与线程CPU时间之比 + 1)*...
来自: 宏浩叔叔的博客
JDK1.5中引入了强大的concurrent包,其中最常用的莫过了线程池的实现ThreadPoolExecutor,它给我们带来了极大的方便,但同时,对于该线程池不恰当的设置也可能使其效率并不能达到...
来自: 周宏亮G的日志
一、线程池如何配置合理线程数(1)CPU密集型: 定义:CPU密集型的意思就是该任务需要大量运算,而没有阻塞,CPU一直全速运行。CPU密集型任务只有在真正的多核CPU上才可能得到加速(通过多线程...
来自: lixinkuan328的博客
1.1需求 数据库300 万条用户数据 ,遍历获取所有用户, 各种组合关联, 获取到一个新的json ,存到redis 上。1.2 难点 数据库比较多, 不可能单线程查询所有的数据到内存。1....
来自: u014071328的专栏
1.为什么要用线程池减少资源的开销 减少了每次创建线程、销毁线程的开销。 提高响应速度,每次请求到来时,由于线程的创建已经完成,故可以直接执行任务,因此提高了响应速度。 提高线程的可管理性,线程是一...
来自: Zach的博客
线程池究竟设置多大要看你的线程池执行的什么任务了,CPU密集型、IO密集型、混合型,任务类型不同,设置的方式也不一样任务一般分为:CPU密集型、IO密集型、混合型,对于不同类型的任务需要分配不同大小的...
来自: weixin_30410999的博客
我是搬运工,以下答案均来自于并发编程网([如何合理地估算线程池大小?](https://link.zhihu.com/?target=http%3A//ifeve.com/how-to-calcula...
来自: jupiter_888的博客
知道吗,你的Java web应用其实是使用线程池来处理请求的。这一实现细节被许多人忽略,但是你迟早都需要理解线程池如何使用,以及如何正确地根据应用调整线程池配置。这篇文章的目的是为了解释线程模型——什...
来自: java、c++、机器学习方向King
一、需求 Web-Server通常有个配置,最大工作线程数,后端服务一般也有个配置,工作线程池的线程数量,这个线程数的配置不同的业务架构师有不同的经验值,有些业务设置为CPU核数的2倍,有些业务...
来自: 小无相功+
直接创建大量线程的坏处 对于一个web服务器,服务器应用程序会处理来自客户端的请求。假设,每到达一个请求,我们的程序都为该请求创建一个线程来执行请求任务,那么这个创建的线程数目将会是无穷无尽的,“...
来自: aier0323305的博客
查看应用的线程堆栈,有大量的jetty线程被堵住,基本都是在等待java.util.concurrent.locks.ReentrantReadWriteLock$NonfairSync,这个可能是什
1. 线程池 线程池线程资源大小确定了服务器的服务能力 默认大小不一定能满足生产环境 线程分配方式决定了服务器的资源利用效率 固定线程数处理多任务,代表:JDK的ThreadPoolExecutor ...
来自: chian7540的博客
线程池的基本概念_threadsStarted:启动的线程数_threadsIdle:空闲的线程数_lastShrink:记录上次线程结束时间,用于销毁空闲线程_threads:使用Concurren...
来自: helpbs
线程池 线程池顾名思义就是事先创建若干个可执行的线程放入一个池(容器)中,需要的时候从池中获取线程不用自行创建,使用完毕不需要销毁线程而是放回池中,从而减少创建和销毁线程对象的开销。Java通过 Ex...
来自: 热爱我的热爱
以问答形式展开,会更有针对性:1、工作线程是不是越多越好? 不是。a、服务器cpu核数有限,所以同时并发或者并行的线程数是有限的,所以1核cpu设置1000个线程是没有意义的。 b、线程切换也是有...
来自: 好奇好学
Java多线程之线程池配置合理线程数目录代码查看公司服务器或阿里云是几核的合理线程数配置之CPU密集型合理线程数配置之IO密集型1. 代码查看公司服务器或阿里云是几核的要合理配置线程数首先要知道公司服...
来自: 努力努力再努力L
对于CPU密集型任务应配置尽可能小的线程,如配置Ncpu+1个线程的线程池(CPU密集型:CPU消耗大,大量的计算,视频转码等)。IO密集型任务线程并不是一直在执行任务,则应配置尽可能多的线程,如2*...
来自: qq_34004088的博客
import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.ThreadPoolExecutor; impo
今年,我也32了 ,为了不给大家误导,咨询了猎头、圈内好友,以及年过35岁的几位老程序员……舍了老脸去揭人家伤疤……希望能给大家以帮助,记得帮我点赞哦。目录:你以为的人生 一次又一次的伤害 猎头界的真...
来自: 启舰
简介在程序开发过程中,在参数传递,函数返回值等方面,越来越多的使用JSON。JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,同时也易于机器解析和生成、易于理...
来自: 一枕江风
wekajava:[reply]xt516803106[/reply]你说的这个确实有可能。
按照上面验证指令重排的例子,我们分析一下。
a初始值为0,假设ThreadB先执行,此时flag=false,跳过第一个if里的代码,接着第二个if发现a=0,则打印。ThreadB先执行完成后再执行ThreadA这种情况很难碰到。
指令重排是客观存在的,这个例子可以优化一下:
static class ThreadB extends Thread{
public void run(){
while(!flag){
continue;
if(a==0){
System.out.println("ha,a==0");
只有flag=true,TheadB才会退出循环。正常情况下,此时a=1,此时没打印。反之有打印,指令重排
可以看看这篇文章:https://www.jianshu.com/p/c9c77d771221
max与group by连用
h_Rhin0:[reply]a745183282[/reply]
不能,select字段需要出现在group by中
浅谈volatile关键字
xt516803106:乱扯,打印出你说的,只不过因为B线程,在A之前执行罢了
max与group by连用
a745183282:[SQL] select * from test t where t.age =(select max(age) from test where id =t.id) as b
order by age desc
[Err] 1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'as b
order by age desc' at line 1 能运行?
如何合理设置线程池大小
u011546953:[reply]Kingson_Wu[/reply]
sigar包了解下