1. 概述
在了解线程(thread)我们应该先了解一下进程(process),这两个都是操作系统的概念,比较抽象难懂,所以下面我就用自己的理解解释一下这两个概念,不过还是建议大家去看看操作系统相关的书里面的介绍。
2. 单任务操作系统
在远古的时候(就是上个世纪),个人电脑还没流行,计算机还是一种稀有资源。那时候的操作系统(比如微软的Dos系统),在一个时刻只能处理一个任务,这就是单任务操作系统,然后大家觉得这样子便宜CPU了,因为有时候在进行I/O操作就是输入输出的时候,CPU就没在干活了。
3. 多任务操作系统
然后多任务操作系统就登场了,难道说操作系统在一个时刻可以同时处理多个任务了?不一定,如果是单核CPU的话,一个时刻还是在处理一个任务,只不过CPU在多个任务之间在作快速切换,切换速度之快,让你根本感受不到它在进行切换,就像是我们的肉眼看不出灯泡在闪烁(因为交流电一直在快速地改变大小和方向)。所以,当你边听歌边聊QQ的时候,别以为它们是在同时运行,只不过停顿的时间之短让你感受不到。不过当你程序开太多,就会觉得停顿很明显了。单核CPU在干活的只有一个人在快速切换做任务,它一个人的能力毕竟是十分有限的,所以这就是为什么大家比较追求多核CPU,人多力量大嘛,就可以有多个人一起在快速切换做任务了,停顿的时间自然又短了。其实这里可以衍生出并行(Parallelism)和并发(Concurrency)的概念,也是很重要的概念,在这里就先提前给大家讲一下,大家也可以先看完下面进程和线程的概念再回过头来看这里。
4. 并发和并行
当有多个线程在操作时,如果计算机只有一个单核CPU,那就不可能真正做到同时进行一个线程以上的处理,例如下图,红色框框代表在处理,你会发现两个线程之间的红色框框是没有重合的地方的,这就是并发的情况。
而如果是多核CPU的话,就可以真正做到同时进行一个线程以上的处理,情况就有可能变成下面这样子,这就是并行的情况。
所以当一台拥有多核CPU或者多个CPU的计算机在处理具有多个线程操作的Java程序时,则线程操作可能是并行的而非并发。
5. 进程和线程
好了,现在终于要说到我们的进程和线程了,其实大家可以把上面的多任务操作系统中的任务看作是进程。在支持线程的操作系统中,把进程作为资源拥有的基本单位,把线程作为调度和分派的基本单位。什么意思呢,就是说进程是面子,线程是里子(仿造王家卫电影《一代宗师》),就像是政府项目招标,他的项目只给公司而不是给个人,但是公司中标后真正干活的还是公司里面的员工,但是钱是给公司的,不过公司得负责给员工发工资。说到这里,相信你已经有点模糊的概念了。我们可以对应一下,政府项目-程序,公司-进程,员工-线程,钱-资源。下面来总结一下:
- 一个程序至少需要一个进程,就像是一个政府项目起码要外包给至少一个公司做,有时候可能多个呢。
- 一个进程至少需要一个线程,就像是一个公司起码要有一个员工
- 进程是资源分配的基本单位,线程作为调度和分派的基本单位,同一个进程中的线程共享资源,就像是政府项目发的钱是给公司的,但是公司干活的是员工,但是公司要拿这些钱去给员工发工资。
以上为个人理解,如果有什么说的不好或者不正确的,还请朋友们指点一下。