《Java 多线程实战系列》- 02 理解进程和线程

130 阅读5分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第 05 天,点击查看活动详情 >>

这一小节,咱主要讲解进程和线程的相关知识。

本节的目标主要有两个:

  • 第一,了解进程、线程的相关些概念
  • 第二,了解计算机资源分配和调度的一些相关知识

进程

其实,进程和线程,是我们特别容易混淆的两个概念。他俩也是咱 Java 研发技术面试时必问的一个问题,比如进程和线程有什么区别?它们之间有哪些联系?等等。

首先,我们先来看看进程,它比较简单,它是指一个正在运行的程序的实例。

咱们可以把系统的资源管理器打开(windows 系统),调整到任务管理器的模式,就可以看到详细信息里面的每一个 exe 的程序,其实就是一个进程。包括你打开了一个 Word 或者 PPT,或者你登录的微信或者 QQ,它都是一个进程。

线程

进程我们了解了,那线程又是啥呢?我们来探讨下线程的由来,主要出于以下几个原因:

第一,由于运行的进程越来越多,导致进程在创建、撤销、切换时需要较大的性能开销,急需一种更轻量级的进程技术来优化、减少性能开销;

比如,我们打开一个 Word 文档,可以编辑、保存等等,但如果它突然就崩溃了,那就需要把它整个关闭,然后再重新打开它。这样的一个过程,实际上会导致特别大的耗时,再如果你的电脑性能不是很强的话,打开一个 Word 可能都要半分钟的时间。

所以呢,就特别需要一种更牛的进程技术,来减小这个过程所带来的性能开销,比如 SMP。

第二,SMP(Symmetrical Multi-Processing)的对称多处理技术,就是我们所知的线程、多线程概念;

第三,在计算机中把进程作为资源管理分配的最小的单位,每个进程都有一个完整虚拟地址空间。

比如,当你打开微信时,计算机就会为微信程序分配一个独立的内存空间。线程它隶属于某一个进程,与进程内的其他线程一起共享这片地址空间,且可以利用进程所拥有的资源,无需再调用新的资源,所以对它的调度所付出的性能开销,明显更少。

由于一个进程,它可以包含多个线程,当某一个线程出现问题导致崩溃的时候,并不会对同一个进程有特别大的影响。由于把任务分得比较细,每一个任务进行调度、切换等等的时候,开销相对就比较少了。

了解了基本概念,我们来看一个简单的例子。

我们在电脑上登录了 QQ 之后,就相当于启动了一个进程,咱在使用 QQ 的过程中,会去聊天打字、截图、传输文件等等,还有在你和朋友聊天时,QQ 它界面的信息是一直在刷新的,看看有没有新的消息过来。

那咱如果用进程和线程来解释的话,也很简单,QQ 就相当于是一个进程,而你完成的每个任务,比如聊天、打字、传输文件等等,都会有单独的线程去操作和完成的。

你看,在使用 QQ 的过程中,我们不管是传输文件,还是发语音,还是打开某个对话框,这些行为都会对应开启一个线程。也就是说,在 QQ 执行的过程中,背后是有多个任务的,也就是有多个线程在背后来进行支撑,来完成 QQ 程序这个进程的运行。

也就是多个任务好像在同时进行,不会因为在传文件就不能发语音了,是吧?如果不这样的话,就会有超大的问题。

你想想,如果说我们在玩 QQ 的时候,但计算机整个 CPU 在执行这个程序时,只进行处理聊天,其他任务不动,比如不去刷新页面,那就尴尬了,不刷新的话页面就会卡死,也就没办法接收新的消息了,那你还聊个啥?

由于咱有了多线程的技术,每一次这 CPU 都会采用多路复用的原则,结合我们前面讲解的并发技术,去执行任务。

比如,在聊天打字的过程当中,CPU 执行了一百毫秒,其中用了五十毫秒去传输文件,又用了五十毫秒刷新了页面,等等。

由于这个过程又非常的快,这些人物事交替着完成的。

所以在我们看来,这些动作都不会有相互的依赖,也不会有相互的阻碍,可以非常顺畅地进行。

通过多线程技术,我们就可以在宏观的层面上支持了“同时”、并发的任务执行。

小结

第一,很重要,进程是系统资源分配的最小单位,线程是 CPU 调度的最小单位;

当你开启了一个进程之后,系统会自动为进城分配它所需要的资源,也就是内存空间;比如刚讲到的,如果你想聊天,想发语音,想发送文件等,是以线程为单位的,CPU 可以对它进行调度。

第二,一个进程管理多个线程,多个线程共享此进程的内存空间。