一、为什么使用多线程?
生活中的场景:
cpu比作理发师,顾客比作线程。
理发师在对顾客A烫发,染发时需要等待一定时间(比如染发需要等10分钟燃料着色),这些空余时间可以对顾客B也进行烫发和染发操作。
使用多线程意义就是对CPU资源的压榨,使cpu利用率更高(理发师:!@#&¥)
二、什么是线程?
躺在你硬盘上的可执行文件,如.exe结尾的文件
执行可执行文件后,把程序相关信息load到内存里,就变成了进程。一个程序可以产生多个进程,也可以一个,由程序自己控制。
专业解释:操作系统进行资源分配的基本单位
一个进程中不同的执行路径就是线程。
程序以线程为单位执行。
先找到main方法,main方法开启了其他线程,线程来回切换,交给cpu执行。
进程是资源分配的基本单位
线程是调度执行的基本单位
多个线程共享一个进程的所有资源
用户态线程,可以理解为线程是有内核空间调度的,纤程是由用户空间调度的
三、多线程相关问题
理发师从顾客A切换到顾客B时,需要记录顾客A的状态(进行到哪步了,长啥样子)。不然切换回A的时候就不知道从哪里开始了。线程的切换也同理,把(指令、数据、计数器)包装好放到一个缓存中,切换到另一个线程继续执行。
有,还是上述例子,理发师只有一位时在阻塞操作(如烫发)就可以服务其他cpu。cpu同理,阻塞操作不需要消耗cpu。就可以让给其他线程运行,充分利用cpu。
当然不是。比如有一万个客户要理发,理发师只有一个。别说理发了,要记住每个顾客都是一件难事,每个顾客都会等到天荒地老。cpu同理,线程的切换也是需要消耗cpu资源的。因此不是越多越好。
方法:
1.压测实验(实际上经常使用这种方式)设定不同的线程数进行压测
2.根据核数设(也不一定,因为可不止一个程序在运行),比如有8个核就设定8个线程
3.让cpu利用率达到80%是比较合理的选择,公式:
Nthread=NcpuUcpu(1+W/C)
参数解释:
Nthread:线程数
Ncpu:cpu核数
Ucpu:期望cpu利用率(如要利用80%)
W/C:等待时间(阻塞时间)与计算时间的比率
如:8个核,期望80%的cpu利用率,等待时间与计算时间比率1:1
套用公式:
8*(%80)*(1+1/1)=12.8
那么设定12-13个线程是比较合理的选择
问题:W/C如何获得?
可以通过一些工具获得,如JProfiler。(俺也没用过)