程序、进程、线程关系
程序:就是操作系统可执行的文件
一个程序加载的时候首先从磁盘读取到内存,开辟一个内存空间,这个内存空间就是一个进程(一个程序可以有多个进程)
进程:资源分配的基本单位
线程:是在进程之内,是调度执行的基本单位,多个线程共享资源
CPU性质
CPU密集性:大量的计算,不需要等待。
IO密集型:大多数时间在等待,完成后只需要简单的拷贝等就能完成。
先来考虑三个问题:
1、单核CPU设定多线程是否有意义?
2、工作线程数是不是设置的越大越好呢?
3、工作线程数(线程池中线程数)设多少合适
预规划:
1、服务器的核心数(还需要考虑GC占用的线程,OS占用的线程,其他程序占用的线程)
2、一般要预留出20%CPU
3、理想情况下的公式:
N(thread) = N (cpu) * U(cpu) * (1 + W/C)
N (cpu): 是处理器的核心数量;Runtime.getRuntime().availableProcessors()
U(cpu): 期望的CPU利用率
W/C : 等待时间与计算时间的比率
计算方式:
1、利用程序调用时间自己计算分析
2、profile工具;JProfile工具(收费);Arthas(阿里开源)
假如1核CPU 计算占50%,另外等待占50%,设置两个比较合适,这样就可以让CPU利用率最高,而且减少线程之间的开销
压测:
根据实际情况来评估出
线程
创建线程默认默认占用空间大小为1M。
那么线程怎么启动的呢?
线程有哪些状态呢?
线程如何中断呢?
线程如何结束呢?
并发
并发编程有哪些特性?
Synchronized锁升级过程是什么?
volatile解决了哪些问题?
常用的JDK工具有哪些?
AQS与CAS
AQS是什么?
CAS又是什么?
它们的存在的价值是什么?
集合
常见的集合有哪些?
List
Set
Queue
Map
线程池
ThreadPoolExecutor解决了哪些问题?如何使用?
Executors工具类定义了哪几种方式?
ForkJoinPool解决了哪类问题?如何使用?
ThreadPoolExecutor源码是如何实现的?