关于生产环境如何配置线程数,还是要根据业务来进行区分,我们时常会听到什么IO密集型、CPU密集型任务...
那么这里提一个问题:大家知道什么样的任务或者代码会被认定为IO/CPU密集?又是用什么样的标准来认定IO/CPU密集?
如果你没有明确的答案,那么就随着这篇文章一起来聊一聊吧。
开篇之前我们先来了解下什么是CPU密集型和IO密集型
CPU密集型(CPU-bound)
CPU密集型也叫计算密集型,顾名思义就是应用需要非常多的CPU计算资源,系统运作大部分的状况是CPU Loading 100%,CPU要读/写I/O(硬盘/内存),I/O在很短的时间就可以完成,而CPU还有许多运算要处理,CPU Loading很高。
在多核CPU时代,我们要让每一个CPU核心都参与计算,将CPU的性能充分利用起来,这样才算是没有浪费服务器配置,如果在非常好的服务器配置上还运行着单线程程序那将是多么重大的浪费。
代码体现:
int n = 0.0
for (i in 0..9999999) {n = Math.cos(i.toDouble())
平常开发应用场景:CPU密集型任务一般来说:计算型代码、Bitmap转换、Gson转换等
IO密集型(I/O bound)
对于IO密集型的应用,就很好理解了,我们现在做的开发大部分都是WEB应用,涉及到大量的网络传输。不仅如此,与数据库,与缓存间的交互也涉及到IO,一旦发生IO,线程就会处于等待状态,当IO结束,数据准备好后,线程才会继续执行。因此从这里可以发现,对于IO密集型的应用,我们可以多设置一些线程池中线程的数量,这样就能让在等待的这段时间内,线程可以去做其它事,提高并发处理效率。
代码体现:
BufferedReader br =new BufferedReader(new FileReader("xxxx"), 1024);
try {while (br.readLine() != null) {}
} finally {if (br != null) {br.close()}
平常开发应用场景:文件读写、DB读写、网络请求等
日常开发中如何优化:
计算密集型任务的特点是要进行大量的计算,消耗CPU资源,比如计算圆周率、对视频进行高清解码等等,全靠CPU的运算能力。这种计算密集型任务虽然也可以用多任务完成,但是任务越多,花在任务切换的时间就越多,CPU执行任务的效率就越低。所以,要最高效地利用CPU,计算密集型任务同时进行的数量应当等于CPU的核心数
线程数 = CPU核数+1
也可以设置成CPU核数*2,这还是要看JDK的使用版本,以及CPU配置(服务器的CPU有超线程)。对于JDK1.8来说,里面增加了一个并行计算,计算密集型的较理想线程数 = CPU内核线程数*2
IO密集型,涉及到网络、磁盘IO的任务都是IO密集型任务,这类任务的特点是CPU消耗很少,任务的大部分时间都在等待IO操作完成(因为IO的速度远远低于CPU和内存的速度)。对于IO密集型任务,任务越多,CPU效率越高,但也有一个限度。常见的大部分任务都是IO密集型任务,比如Web应用
线程数 = CPU核心数/(1-阻塞系数)
这个阻塞系数一般为0.8~0.9之间,也可以取0.8或者0.9。套用公式,对于双核CPU来说,它比较理想的线程数就是20,当然这都不是绝对的,需要根据实际情况以及实际业务来调整。
Java并发内容还有很多比如同步工具类、lock类原子类、集合相关类、Executor框架相关类
当然还有一张更详细的图
内容容太多,很多小伙伴都迫不及待的想获取,但是并发知识大,一口吃不下。想成为一名优秀的Java开发,学好并发还是要静下心来好好学习,学好了绝对是你走入高薪行列的必备能力。
这次小编周末和京东的Monkey大佬一起吃了个饭,聊了下这个并发编程如何学习,他是这方面的专家,之前在京东内部也做过很多这方面的分享,我特邀请他为大家来开设专栏小课,内容如下:
《Java并发编程》深度精讲!这期课程是根据一线大厂面试内容专门开设,并且限时0.02元!针对技术人的面试考点与成长路径,给程序员传授实用的技能跟面试技巧,培养真正符合一线互联网公司用人需求的人才。针对具体技能进行深度剖析讲解,结合一线互联网大厂热门面试题详析,搞定大厂面试,拿下心仪offer。
赶紧上车,报名的同学还有机会获取金三银四面试书一本。点击扫码,即可购课~
点击阅读原文也可购课~