java多线程:1_2、程序、进程和线程,单线程程序、多线程程序

183 阅读8分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第5天,点击查看活动详情

声明:本教程不收取任何费用,欢迎转载,尊重作者劳动成果,不得用于商业用途,侵权必究!!!

目录1

程序

进程

线程


程序

是计算机指令的集合,它以文件的形式存储在磁盘上。

进程

是一个程序在其自身的地址空间中的一次执行活动。

如: 当我们打开一个记事本程序的时候,它在****自身的地址空间中的这一次活动,我们就把它叫做一个进程

进程是资源申请、调度和独立运行的单位,因此,它使用系统中的运行资源;

而程序不能申请系统资源,不能被系统调度,也不能作为独立运行的单位,

因此,它不占用系统的运行资源。

程序和进程是不同的概念, 一个程序可以对应多个进程。

我们可以同时打开多个记事本程序,也就是启动了记事本程序的多个进程。

线程

是进程中的一个单一的连续控制流程。一个进程可以拥有多个线程。

在我们进程的地址空间当中,真正完成我们运算任务的就是线程。

线程又称为轻量级进程,它和进程一样拥有独立的执行控制,由操作系统负责调度,

区别在于线程没有独立的存储空间,而是和所属进程中的其它线程共享一个存储空间,

这使得线程间的通信远较进程简单。

​————————————————————————————————————————

目录2

一、单线程程序

二、多线程程序

三、在我们的程序执行过程当中,是由cpu来执行的

1、那为什么我们在启动多个进程 或者说 一个进程当中的多个线程 的时候

我们看到好像是这几个进程 或者说 这几个线程 他们在同时运行呢?

2、那么我们为什么还要设计多线程程序呢?

3、另外我们能不能够用多进程来代替多线程程序呢?


一、单线程程序

在进程的地址空间当中,只有一个线程,由这一个线程来完成我们程序的执行任务。

例如:这就好像有一个患者要动手术,医院由于人手紧张,给这个患者就配备了一个医生,

我们可以把这名医生看作是一个单线程,由他来完成给这个患者动手术,这样的一个工作任务。

当然这是比较危险的。要注意的是在一个进程当中,肯定至少会有一个线程。

二、多线程程序

在我们进程的地址空间当中,有两个线程(或两个以上的线程),他们可以并发的运行,

来完成我们程序的执行任务。

例如:这就好像医院为了完成这次手术,给这个医生配备了几名护士,

由这个医生和这几名护士来共同完成动手术的这样一个工作任务。

那么这个医生和这几名护士我们就可以把他看作是多线程程序。医生负责为这个患者动手术,

其中一名护士负责给医生拿动手术所用的器具,另外一个护士负责给医生擦汗,由他们共同来完成这次

工作任务。那么手术效率就要好些,患者的生存希望也会提高。这就是一个多线程的程序

三、在我们的程序执行过程当中,是由cpu来执行的

在我们单cpu的平台下,某一个时刻只能有一个线程在运行。

1、那为什么我们在启动多个进程 或者说 一个进程当中的多个线程 的时候

我们看到好像是这几个进程 或者说 这几个线程 他们在同时运行呢?

这主要是因为线程是由我们操作系统来调度的

在我们windows平台下,操作系统会给我们每一个线程分配一个时间片

这是一个很短的时间间隔,当线程A运行到它的时间片终止的时候,

那么操作系统就会随机的去选择另外一个线程,比如说是线程B来运行。

那么当线程B它的时间片终止的时候,操作系统又会随机的去选择另外一个线程来运行。

因为这个时间片很短,那么操作系统在我们多个线程之间,频繁的发生切换,

给我们的感觉:就好像是这几个线程,他们在同时运行一样。

2、那么我们为什么还要设计多线程程序呢?

那么既然在单cpu的硬件平台下,某一个时刻只有一个线程能够运行,

那么我们为什么还要设计多线程程序呢?我们能不能够用多进程来代替多线程程序呢?

对于一个多线程程序来说,虽然说它在一个单cpu的平台下,某一个时刻只有一个线程在运行,

但如果我们的程序移植到一个多cpu的硬件平台下,那么在同一个时刻下,就可以同时运行多个线程,

从而达到真正意义上的并发运行,我们在编写多线程程序的时候,我们要考虑到这样的一个可移植性,

在我们真正的移植到一个多cpu的平台下,我们程序的执行效率会大幅的提高。

3、另外我们能不能够用多进程来代替多线程程序呢?

对于一个进程与进程之间的切换来说,因为每一个进程,操作系统都要给他分配自身的独立的地址空间,

当两个进程之间发生切换的时候,那么他们要交换整个内存地址空间,

而对于多线程程序来说,因为一个进程当中的多个线程,它们是共享的同一个存储空间,

所以在多线程程序在进行切换的时候,那么只需要改变程序的执行路线和它们的局部变量就可以啦

当然这种切换的效率远远高于我们进程之间切换的效率,

所以我们在完成需要同时执行多个任务的程序当中,那么我们通常是采用这种多线程程序,

而最好不要采用多进程来完成。

比如说:我们做一个网站的后台服务程序,当有一个客服连接请求到来的时候,

我们应该是去开辟一个线程去为他服务,而不是开辟一个进程来为他服务。

这样对于我们服务器端的资源的合理利用、包括效率的提升,都是有好处的。