[01] 进程和线程
1、进程和线程是什么
在理解进程和线程之前,必须要知道的一个基本事实就是,单个CPU一次只能运行一个任务。我们所知道的多任务其实是因为CPU太快太快太快了,它不断在多个任务之间切换执行,以至于在我们看来他就是同时在执行多个任务,实则不然。
那么进程和线程是什么?
假设现在有这样的程序代码A和B,执行程序代码所需要的资源如RAM/显卡/GPS等(除了CPU),也即是程序代码的运行资源环境,我们暂且称之为程序的上下文。于是A和B在执行的时候:
- CPU先加载程序A的上下文,然后执行A,保存程序A的上下文
- 调入下一个要执行的程序B的上下文,执行B,保存B的上下文
- ...
A的粒度实际上还显得太大,因为在其中还有代码片段a1,a2... 程序代码B同理。那么在执行A时,实际上是执行a1,a2,a3等等的过程,这里的代码片段a1/a2/a3,粒度更小,它们的上下文资源环境也都是共享的,即A程序代码的上下文。
于是进程和线程就来了,它们都是CPU工作时间段的利用,不过粒度大小不同:
- 这里的A/B就是进程
- a1/a2/a3或b1/b2/b3就是线程
那么表象看来是什么呢?打开windows的任务管理器,你就可以看到很多个进程:
进程就是一个可执行的程序的一次运行过程,它是系统进行资源分配和调度的一个独立单位。如我们打开QQ(TIM版),就是开了一个进程,在这个进程里,我们传输文字,开了一个线程;传输语音,又开了一个线程。线程是程序中的一个执行流,它是属于进程的, 每个线程都有自己专有的寄存器(栈指针、程序计数器等),但代码区是共享的,即不同的线程可以执行同样的函数。
所以,进程和线程的联系大概如下:
- 一个线程只能属于一个进程,但是一个进程可以拥有多个线程
- 系统资源分配给进程,同一进程中所有线程共享该进程的所有资源
- 线程是指进程内的一个执行单元,也是进程内的可调度实体
在参考链接中,有一篇文章极其形象和容易理解,是阮一峰老师的《进程与线程的一个简单解释》,强烈强烈强烈推荐大家阅读了。
2、多线程
多线程,是指程序中包含多个执行流,即一个程序中可以同时运行多个不同的线程来执行不同的任务,也就是说允许单个程序创建多个并行执行的线程来完成各自的任务。
优势:
- Java支持编写多线程的程序
- 多线程可以同时并发执行多个任务
- 多线程最大限度地降低CPU的限制时间,从而提高CPU的利用率
缺点:
- 线程同样占用内存,线程越多占用内存也越多
- 多线程需要协调和管理,共享资源会相互影响
任何一个Java程序至少有一个线程,即主线程(执行main方法),它是产生其他线程子线程的线程,通常最后结束,因为要执行其他子线程的关闭工作。