程序、进程、线程关系
程序:就是操作系统可执行的文件
一个程序加载的时候首先从磁盘读取到内存,开辟一个内存空间,这个内存空间就是一个进程(一个程序可以有多个进程)
进程:资源分配的基本单位
线程:是在进程之内,是调度执行的基本单位,多个线程共享资源
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源码是如何实现的?
本文深入探讨了Java中的JMM(Java内存模型),并详细阐述了程序、进程和线程之间的关系。CPU密集型与IO密集型任务的区分对于理解线程的设置至关重要。在单核CPU下,多线程仍有其意义,但线程数量并非越多越好,合理的线程池大小可通过公式N=CPU*U*(1+W/C)进行预估。同时,文章介绍了线程的创建、状态、中断与结束,以及并发编程的特性。此外,还讨论了Synchronized锁升级和volatile关键字的作用,并提到了JDK中的AQS和CAS机制。最后,文章提到了Java集合、线程池如ThreadPoolExecutor的使用及其背后的原理。

被折叠的 条评论
为什么被折叠?



