今天同事突然问我线程与进程的关系,虽然给她解释完,但是看她茫然的眼神,我就知道并没有解释清楚。
程序概述
谈进程与线程之前,我们先谈下什么是程序,程序是为实现特定目标或解决特定问题而用计算机语言编写命令序列的集合。说得通俗点就是你用计算机听得懂话(编程语言)命令计算机为你做特定的事情。
进程概述
在我理解中,一个进程就是一个程序的一次执行过程,如果要专业的话来说
进程是一个具有一定独立功能的程序在一个数据集上的一次动态执行的过程,是操作系统进行资源分配和调度的一个独立单位,是应用程序运行的载体。进程是一种抽象的概念,从来没有统一的标准定义。进程一般由程序,数据集合和进程控制块三部分组成。 程序用于描述进程要完成的功能,是控制进程执行的指令集。 数据集合是程序在执行时所需要的数据和工作区;程序控制块包含进程的描述信息和控制信息是进程存在的唯一标志
实例
打开window的任务管理器,创建一个记事本,打开记事本,会发现在任务管理器的进程列表发现“记事本”这个进程
我们多创建3个记事本,全部打开,观察进程列表,会发现有四个进程正在运行
那进程是如何工作的,线程(小弟)就闪亮登场了,在谈线程前,我们先总结下程序与进程的关系。
程序与进程的关系
- 一个程序可以对应多个进程,表示该程序被多次执行。
- 一个进程只能对应于一个程序,表示该进程是按照某个程序进行的一次执行过程。
线程
很多人好奇进程是如何做事的。事实上进程就是个大爷,是不做事的,而是吩咐别人做事,"别人"就是线程这位苦逼的被压榨者,当进程要做一件事,就会开启一个线程,所以我们可以得出一个结论,一个进程至少要有一个线程。没有线程这位苦逼的劳力就没人做事。被这么压榨的线程有一天终于爆发了,准备搞事情,农民起义。不幸的是他还没正式行动前就失败了。失败的原因如下
- 线程不能单独存在,必须依赖且由进程产生,它是进程的组成部分
- 进程可以有多个线程(多线程),极端情况下,至少有一条线程。
实例
打开记事本,任务管理器
可以看到这个记事本的进程里,有6个线程。
线程的生命周期
新建-->就绪-->运行-->阻塞-->死亡
你平时去商城上厕所,准备去上厕所就是新建,上厕所要排队,排队就是就绪,有坑位了,轮到你了,拉屎就是运行,你拉完屎发现没有手纸,要等待别人给你送纸过来,这个状态就是阻塞,等你上完厕所出来,上厕所这件事情结束了就是死亡状态了。
注意:便秘也是阻塞状态,你便秘太久了,别人等不及了,把你赶走,这个就是挂起,还有一种情况,你便秘了,别人等不及了,跟你说你先出去酝酿一下,5分钟后再过来拉屎,这就是睡眠
很多人有这样的体验,打开浏览器,一边写博客,一边听歌,我们必须打开两个网页。一个用来写作,一个听歌曲,现在浏览器有两种处理方案,一种先执行听歌任务,播放任务结束后,在执行写作任务。如果按这种方式执行,写博客的想砸电脑的心都有了,另一种就是多线程执行,
浏览器开启两个线程,一个线程负责播放音乐任务,一个线程打开博客写作,相当于并行处理两个任务。但这里的并行有时候并不是真正的的并行,而是将CPU分片,每一片的单位是0.001秒,两个线程轮番占用CPU的时间,最终在2个线程优先级相同的情况下,会各占用CPU 0.5秒的时间。但因为这个切换太快了,用户是根本感觉不到的。但这种机制并不是真正的并行。
- 为了更好的利用cpu的资源,如果只有一个线程,则第二个任务必须等到第一个任务结束后才能进行,如果使用多线程则在主线程执行任务的同时可以执行其他任务,而不需要等待。
- 进程之间不能共享数据,线程可以。
- 系统创建进程需要为该进程重新分配系统资源,创建线程代价比较小。
总结
进程和线程都是一个时间段的描述,是CPU工作时间段的描述。
================================================
关于多线程后续Java的线程整理会详细介绍