处理器核心线程数:
RunTime.getRunTime().availableProcessors();
计算程序所需线程的总数:
线程数 = CPU可用核心数/(1-阻塞系数),其中阻塞系数的取值在0-1之间
计算紧密型任务的阻塞系数为0,而IO密集型任务的阻塞系数接近1
构建计算密集型并发应用的一些经验:
- 子任务的划分数应不少于处理器核心数。
- 线程数多于处理器核心数对性能提升毫无帮助
- 在子任务划分数超过一定数量以后,再增加子问题划分数对于性能的提升将十分有限
例如我们求一个区间里的素数时,我们可以将区间等分成小的区间去进行并发操作
如果是IO密集型或有关键的IO操作,则开多个线程将有助于提高性能
对于计算密集型任务,程序开的线程数超过处理器核心数对程序性能实际是有害无益
应该充分利用现代线程API和线程池
必须避免共享可变状态,并用隔离可变性或共享不可变性取而代之
对于IO密集型应用,阻塞时间是影响线程数量的关键因素
对于计算密集型,我们应将程序数限制为处理器核心数相同
虽然无法回避状态处理问题,但我们可以有三种可选设计方法
- 共享可变性方法
- 隔离可变性方法
- 纯粹不可变性方法
举例:共享可变类似与 在黑板上写一个标记,大家依次把自己的年龄加上去
隔离可变性类似与 我让大家把年龄发给我,我自己去加
纯粹不可变类似于大家把自己的年龄加好过后交给自己右边的人依次下去