Java多线程--多线程相关概念

发布时间:2024年01月19日

一、相关概念

我们之前学习的程序在没有跳转语句的情况下,都是由上至下沿着一条路径依次执行。现在想要设计一个程序,可以同时有多条执行路径同时执行。比如,一边游戏,一边qq聊天,一边听歌,怎么设计?
image.png
要解决上述问题,需要使用多进程或者多线程来解决。

(1)程序、进程与线程

  • 程序(program):为完成特定任务,用某种语言编写的一组指令的集合。即指一段静态的代码,静态对象。

  • 进程(process):程序的一次执行过程,或是正在内存中运行的应用程序。如:运行中的QQ,运行中的网易音乐播放器。

    • 每个进程都有一个独立的内存空间,系统运行一个程序即是一个进程从创建、运行到消亡的过程。(生命周期)
    • 程序是静态的,进程是动态的。
    • 进程作为操作系统调度和分配资源的最小单位(亦是系统运行程序的基本单位),系统在运行时会为每个进程分配不同的内存区域。
    • 现代的操作系统,大都是支持多进程的,支持同时运行多个程序。比如:现在我们上课一边使用编辑器,一边使用录屏软件,同时还开着画图板,dos窗口等软件。
  • 线程(thread):进程可进一步细化为线程,是程序内部的一条执行路径。一个进程中至少有一个线程。

    • 一个进程同一时间若并行执行多个线程,就是支持多线程的。

    • 在这里插入图片描述

    • 线程作为CPU调度和执行的最小单位

    • 一个进程中的多个线程共享相同的内存单元,它们从同一个堆中分配对象,可以访问相同的变量和对象。这就使得线程间通信更简便、高效。但多个线程操作共享的系统资源可能就会带来安全的隐患

    • 下图中,红框的蓝色区域为线程独享,黄色区域为线程共享。

image.png

红框内对应一个进程,即一个应用程序,可以理解为JVM的一个实例,相当于Java虚拟机现在在运行这样一个项目,这个项目就是应用程序,一运行就是一个进程。

一个进程里面可以有多个线程,即执行路径。

有一些内存结构是每个线程一份,有一些内存结构是多个线程共享的。

每一个线程都有一个虚拟机栈、本地方法栈、程序计数器,多个线程对应的进程只有一份方法区和堆

栈可能有多个,每个线程对应一个虚拟机栈,对应的栈执行到哪里了,这里有一个记录,指定的地址就是程序计数器,所以程序计数器也是每个线程一份。本地方法栈就是调用内存方法的栈,每个线程一份。

大家共享方法区和堆,只有一个堆,优点是可以使多个线程处理一个进程共享数据问题比较方便(线程间的通信),缺点是不安全(线程的安全问题)。

注意:

不同的进程之间是不共享内存的。

进程之间的数据交换和通信的成本很高。


【面试题】

?程序、进程和线程的区分:

  • 程序(program):为完成特定任务,用某种语言编写的一组指令的集合。即指一段静态的代码
  • 进程(process):程序的一次执行过程,或是正在内存中运行的应用程序。
    • 程序是静态的,进程是动态的。
    • 进程作为操作系统调度和分配资源的最小单位
  • 线程(thread):进程可进一步细化为线程,是程序内部的一条执行路径
    • 线程作为CPU调度和执行的最小单位

(2)查看进程和线程

我们可以在电脑底部任务栏,右键----->打开任务管理器,可以查看当前任务的进程

1、每个应用程序的运行都是一个进程

image.png

2、一个应用程序的多次运行,就是多个进程

image.png

3、一个进程中包含多个线程

image.png

(3)线程调度

  • 分时调度
    所有线程轮流使用 CPU 的使用权,并且平均分配每个线程占用 CPU 的时间
  • 抢占式调度
    优先级高的线程以较大的概率优先使用 CPU。如果线程的优先级相同,那么会随机选择一个(线程随机性),Java使用的为抢占式调度

在这里插入图片描述

(4)多线程程序的优点

背景:单核CPU为例,只使用单个线程先后完成多个任务(调用多个方法),肯定比用多个线程来完成用的时间更短,为何仍需多线程呢?

多线程程序的优点:

  1. 提高应用程序的响应。对图形化界面更有意义,可增强用户体验。
  2. 提高计算机系统CPU的利用率
  3. 改善程序结构。将既长又复杂的进程分为多个线程,独立运行,利于理解和修改

二、补充概念

(1)单核CPU和多核CPU

单核CPU,在一个时间单元内,只能执行一个线程的任务。例如,可以把CPU看成是医院的医生诊室,在一定时间内只能给一个病人诊断治疗。所以单核CPU就是,代码经过前面一系列的前导操作(类似于医院挂号,比如有10个窗口挂号),然后到cpu处执行时发现,就只有一个CPU(对应一个医生),大家排队执行。

这时候想要提升系统性能,只有两个办法,要么提升CPU性能(让医生看病快点),要么多加几个CPU(多整几个医生),即为多核的CPU

?问题:多核的效率是单核的倍数吗?譬如4核A53的cpu,性能是单核A53的4倍吗?理论上是,但是实际不可能,至少有两方面的损耗。

  • 一个是多个核心的其他共用资源限制。譬如,4核CPU对应的内存、cache、寄存器并没有同步扩充4倍。这就好像医院一样,1个医生换4个医生,但是做B超检查的还是一台机器,性能瓶颈就从医生转到B超检查了。
  • 另一个是多核CPU之间的协调管理损耗。譬如多个核心同时运行两个相关的任务,需要考虑任务同步,这也需要消耗额外性能。好比公司工作,一个人的时候至少不用开会浪费时间,自己跟自己商量就行了。两个人就要开会同步工作,协调分配,所以工作效率绝对不可能达到2倍。

(2)并行与并发

  • 并行(parallel):指两个或多个事件在同一时刻发生(同时发生)。指在同一时刻,有多条指令多个CPU同时执行。比如:多个人同时做不同的事。

  • image.png

  • image.png

  • 并发(concurrency):指两个或多个事件在同一个时间段内发生。即在一段时间内,有多条指令单个CPU快速轮换、交替执行,使得在宏观上具有多个进程同时执行的效果。

  • image.png

  • image.png

在操作系统中,启动了多个程序,并发指的是在一段时间内宏观上有多个程序同时运行,这在单核 CPU 系统中,每一时刻只能有一个程序执行,即微观上这些程序是分时的交替运行,只不过是给人的感觉是同时运行,那是因为分时交替运行的时间是非常短的

而在多核 CPU 系统中,则这些可以并发执行的程序便可以分配到多个CPU上,实现多任务并行执行,即利用每个处理器来处理一个可以并发执行的程序,这样多个程序便可以同时执行。

目前电脑市场上说的多核 CPU,便是多核处理器,核越多,并行处理的程序越多,能大大的提高电脑运行的效率。

文章来源:https://blog.csdn.net/m0_55746113/article/details/135691683
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。