Java多线程详解①(全程干货!!!)


这里是Themberfue

今天,我们将正式进入多线程章节的讲解,希望我的讲解能够让你理解😎


进程

在进入多线程的讲解中,我们先引入进程的概念及其解释

· 操作系统都是大家耳熟能详的名词,常见的操作系统主要有:Linux,Windows,MacOs,IOS,Android,Unix 

· 操作系统是计算机中的一个重要软件,一个搞管理的软件:

        1.管理各种硬件设备,通过驱动程序来管理各种硬件设备

        2.给各种应用程序,提供一个相对稳定的工作环境

· 进程是操作系统中的一个非常重要的概念,一个运行起来的程序,就称为进程。

· 在现代计算机中,同时运行着数十个进程,甚至上百个都是不奇怪的,这就需要操作系统很好的管理这里进程,避免在进程在运行过程中发生不必要的意外。

· 这就需要借助数据结构来管理这些进程。

· 进程是操作系统中资源分配的基本单位

· 站在操作系统的角度上,是如何管理进程的?

        1. 首先需要一个结构体,描述该进程的一个属性以及数据,也就是进程控制块(PCB)

        2. 随后,需要将这些结构体通过某个数据结构组织起来,方便执行增删查改等操作,例如:Linux就是使用链表来组织这些结构体的。

· 那么一个进程控制块(PCB)中有哪些重要属性呢?

        1. pid(进程id),作为唯一标识符指定该线程,进程的身份标识符

        2. 内存指针,进程在运行的过程中依赖于内存资源,进程通过内存指针知道执行指令的位置在哪里。

        3. 文件描述符表,在进程运行的时候,需要和硬盘的数据进行交互,硬盘上的数据,就是通过文件的形式存储的,在进程打开硬盘中的文件数据时,就会保存到文件描述符表中。

        4. 进程状态,主要有 "就绪状态" 和 "阻塞状态" ,就绪状态表示此进程随时可以在CPU上执行,阻塞状态则是不适合到CPU上执行。

        5. 进程优先级,同一时间在运行在CPU上运行的进程可能非常多,那么有些进程可能执行的指令多,在整个进程列表中,占据了更重要的位置,那么其的优先级就更高,比如在电脑上运行3A游戏时,这个游戏的进程的优先级一定时最高的。

        6. 进程上下文,在进程执行的过程中,可能尚未执行完,被调度走了,那么回过头再度执行该进程时,就要根据该进程的上下文来定位到上次执行到哪里了。类似于游戏的存档读档。

        7. 进程的记账信息,起到统计功能,统计每个进程都在CPU上运行了多久,如果发现某个进程很久没有吃到CPU资源了,那么就会倾斜一个资源给该进程。


· 在Windows系统,打开一个后缀为exe的文件,运行了一个程序,就是创建了一个进程。

· 在启动时,操作系统会把exe文件的指令和数据加载到内存中,后续在运行该程序时,就从内存读取指令和数据执行。

· 在Windows系统中可以通过查看任务管理器来进一步查看进程的相关信息,不过不会太详细,只会展示一个简单的PCB信息。


 · 早期的操作系统,都是单任务操作系统,一个程序启动了,另一个程序就得结束

· 随着时代的发展,也就诞生了多任务操作系统,可以同时执行多个任务的操作系统,但是早期的CPU还都是单核的,一个核心该如何执行多个任务呢?这就使用了分时复用:把一个单位时间,分成很多份,第一份执行进程1 的指令,第二份执行进程2 的指令,以此类推,在切换过程,由于CPU执行指令的速度时很快的,人还未反应过来,指令就执行完了,也就达成了执行多任务的效果。


 · 把一个CPU核心上,按照分时复用,执行多个进程的方式称为:"并发执行"

· 把多个CPU核心上,同时执行多个进程的方式称为:"并行执行"

· 在现代CPU运行这些进程时,并发执行和并行执行是同时存在的,也很少会把作区分,统一习惯性称为 并发


线程

· 聊完了进程,终于进入正题,也就是线程了。

· 服务器就好像一个餐馆,需要在同一时间处理多个客户的订单,所以引入多进程编程的方式,可以高效处理多个客户端发送请求的情况。

· 但随着时间的推移,互联网越来越普及,走进了千家万户,导致网民大幅增加,服务器所要接受的请求以及给出的响应也就愈来愈多。

· 进程是个很 "重" 的概念,服务器每接受一个请求,都要创建销毁一个进程来响应客户的请求。由于创建和销毁进程的开销都很大,频繁这样做导致服务器的处理效率也越来越低。

· 于是就引入了线程(Thread),轻量级线程,相比较于进程,线程的创建和销毁的开销远小得多。一定程度缓解了请求增多,服务器处理低效的问题

· 每个进程,都相当于要执行的一个任务,每个线程,也是一个要执行的任务(运行的一段代码指令)。每个进程中,都会包含一个或者多个线程。所以进程是包含线程的。

· 上诉红框框起来的可以看成是一个个线程,但Windows任务管理器看到的是并不是线程,它是看不到进程内部的线程的。

· 可以借助一些其他工具查看,例如:VS的调试工具,Windbg等等。


 · 如上述所说,进程是操作系统资源分配的基本单位。进程内部管辖的多个线程之间,会共享该进程的内存资源,硬盘资源和网络带宽等等。

· 进程创建时,需要申请资源,销毁时,需要释放资源,这些都很消耗性能的事情。

· 但对于线程来说,只是第一个线程创建时(随着进程的创建而创建)申请资源,后续再次创建线程时,不再涉及到申请资源的操作,同理,只有最后一个线程销毁(随着进程的销毁而销毁)才释放资源。通过这样的的操作,大大缩小了性能的消耗

· 进程与进程之间,所涉及到的资源是相互独立,互不打扰的。但是某个进程里的线程与线程之间就不是相互独立的,而是资源共享的,这样就难免会导致 "线程安全"  问题。

· 线程的在CPU的调度与进程在CPU的调度相差不大,线程是CPU上调度执行的基本单位

· 线程在CPU上的调度是随机的。例如:一个进程中包含三个线程,那么可能是线程1先执行,或者线程2先执行,甚至线程3先执行。这三个线程可能在CPU的一个核心上执行,也可能是在三个核心上执行。这些线程的调度都是由操作系统的 "调度器" 的完成的,程序员无从干涉。

· 线程与进程一样,所记录的数据无非就是,调度相关,状态,优先级,记账信息,上下文


多线程

        现假设一个场景,有一个房子,房子的桌子上摆放着 100 只鸡,房间目前只有一个人,只能由他吃完这些鸡。

 

        我们都知道,这样由一个人吃完,效率是非常低效的,也就是好比单进程开发,效率是远比多进程低的。

         于是,我们引入第二个进程,也就是第二套房子,第二张桌子以及第二个人,将鸡对半两份,一人吃 50 份。

        这样效率确实上去了,但是又是创建房子,又是创建桌子的,难免消耗过多的资源,不如直接叫第二个人来第一套房子,与第一个人一起吃,这样便大大缩小了资源的开销。 

 

         这里的人也就是一个线程,两个线程在一个进程里同时工作,效率也会大大加大,也不需要消耗过多的资源。

        那么这时候就有人问了:那我多几个线程是不是更多,从理论上来说确实是的。

 

        虽然提高线程的数目,能够提升效率,但也不是 “线性增长” 的。在线程达到一定数目时,就算线程再多,效率也不会又显著的增加了。

        桌子的空间本来就那么大,人多了还挤来挤去,不能很好的管理,也就导致拖慢了效率。

        线程的数目如果太多,线程的开销也会变得明显,因为调度开销从而拖慢程序的性能。

 

 现控制只有四个线程工作,也能确保一定不会出现问题吗?不一定的。

        比如:同一个人,同时拿到了同一个鸡,这时候该怎么办,就导致线程冲突问题

        再比如:一个人没用吃的想吃的,非常生气,直接掀桌不干了,导致整个进程崩溃,这是非常严重的。


 Java中也是提供了相应的类,以编写多线程代码。

至于该如何编写多线程代码。

毕竟后事如何,且听下回分解。😊😊😊

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/56585.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

opencv - py_ml - py_knn k-最近邻算法

文章目录 1.理解 k-最近邻算法目标理论OpenCV 中的 kNN其他资源 2.使用 kNN 对手写数据进行 OCR目标手写数字的 OCR英文字母的 OCR其他资源 1.理解 k-最近邻算法 目标 在本章中,我们将理解 k-最近邻算法 (kNN) 的概念。 理论 kNN 是监督学习中最简单的分类算法之…

【js逆向专题】12.RPC技术

目录 一. websocket1. 什么是websocket2. websocket的原理3. websocket实现方式1. 客户端2.服务端3. 实际案例1. 案例目标2. 解析思路 二. RPC1. RPC 简介2.Sekiro-RPC1. 使用方法1. 执行方式2.客户端环境3.使用参数说明 2. 测试使用1. 前端代码2. SK API3.python调用代码 三.项…

C++,STL 042(24.10.21)

内容 一道练习题。 (涉及list,sort) 题目(大致) 将Person自定义类型进行排序(Person中属性有姓名、年龄、身高),按照年龄进行升序,如果年龄相同则按照身高进行降序。 …

openpnp - 解决“底部相机高级校正成功后, 开机归零时,吸嘴自动校验失败的问题“

文章目录 openpnp - 解决"底部相机高级校正成功后, 开机归零时,吸嘴自动校验失败的问题"概述笔记问题现象1问题现象2原因分析现在底部相机和吸嘴的位置偏差记录修正底部相机位置现在再看看NT1在底部相机中的位置开机归零,看看是否能通过所有校…

HarmonyOS鸿蒙- 一行代码自动换行技巧

DevEco Studio 编辑器设置 一行代码自动换行显示。 一、代码自动换行设置方式路径:File > Editor > General 如图: 二、找到标题:Soft Wraps 勾选《Soft-wrap these files:》,然后在后面添加*.ets 然后保存即可。添加后&#xff0c…

LangSplat和3D language fields简略介绍

LangSplat: 3D Language Gaussian Splatting 相关技术拆分解释: 3dgs:伟大无需多言SAM:The Segment Anything Model,是图像分割领域的foundational model,已经用在很多视觉任务上(如图像修复、物体追踪、图…

支持国密算法的数字证书-国密SSL证书详解

在互联网中,数字证书作为标志通讯各方身份信息的数字认证而存在,常见的数字证书大都采用国际算法,比如RSA算法、ECC算法、SHA2算法等。随着我国加强网络安全技术自主可控的大趋势,也出现了支持国密算法的数字证书-国密SSL证书。那…

软件设计师:软件工程

文章目录 一、开发模型(1)瀑布模型(需求明确)(2)增量模型(快速构建)(3)演化模型(迭代模型)(3.1)原型模型&…

【Docker】docker | 部署nginx

一、概述 记录下nginx的部署流程;将conf配置文件映射到宿主机 前提依赖:自行准备nginx的镜像包 二、步骤 1、运行、无映射 docker run --name nginx -p 80:80 -d nginx:1.18.0-alpine 80:80,前面是宿主机端口;如果冲…

IPsec简单介绍

VPN相关介绍 VPN:虚拟私有网络 例如:像这种不加密的 PPTPL2TP ------- 一般用在windows server 服务端(但是大多数企业不用这个) 假如总公司内部的PC1要去访问分公司内部的PC2(一般用在公司服务器有内网的服务&#…

Oracle 使用位图索引 Cost降低200倍! 探讨位图索引的利与弊

一.简介 位图索引(Bitmap Index) 是 Oracle 数据库中一种特殊类型的索引,适用于低基数(Low Cardinality)列,即那些列中可选值相对较少的情况下使用。它与常规的 B-tree 索引不同,位图索引通过位…

003:无人机概述

摘要:本文介绍无人机的定义和分类、无人机系统定义、民用无人机驾驶员分类和应用领域。 一、无人机的定义和分类 1.无人机定义 无人机是一种能够在无人驾驶的条件下完成复杂空中飞行任务和各种负载任务的飞行器,可以被视为“空中机器人”。它利用先进的…

(48)MATLAB使用firls函数设计均衡器

文章目录 前言一、频域均衡器的设计二、MATLAB源代码1.firls函数与freqz函数2.MATLAB仿真源代码3.代码说明 三、仿真结果画图 前言 利用MATLAB的firls函数,根据所要求的频率向量和频响幅度向量,设计出所需的均衡器,使得包括滤波器在内的系统…

qt 构建、执行qmake、运行、重新构建、清除

qt右键功能有 构建、执行qmake、运行、重新构建、清除,下面简单介绍一下各个模块的作用。 1. 执行qmake qmake是一个工具, 它根据pro文件生成makefile文件,而makefile文件中则定义编译与连接的规则。pro文件中定义了头文件,源文件…

Spring Cache Caffeine 高性能缓存库

​ Caffeine 背景 Caffeine是一个高性能的Java缓存库,它基于Guava Cache进行了增强,提供了更加出色的缓存体验。Caffeine的主要特点包括: 高性能:Caffeine使用了Java 8最新的StampedLock乐观锁技术,极大地提高了缓存…

k8s部署使用有状态服务statefulset部署eureka集群,需登录认证

一、构建eureka集群镜像 1、编写dockerfile文件,此处基础镜像为arm版本,eureka目录中文件内容:application-dev.yml、Dockerfile、eureka-server-1.0-SNAPSHOT.jar(添加登录认证模块,文章最后附上下载连接) FROM mdsol/java8-j…

Go使用exec.Command() 执行脚本时出现:file or directory not found

使用 Go 提供的 exec.Command() 执行脚本时出现了未找到脚本的 bug,三个排查思路 : exec.Command(execName, args…) 脚本名字不允许相对路径 exec.Command(execName, args…) execName 只能有脚本名,不允许出现参数 如果你是使用 Windows …

为什么要使用网络IO内存数据库?

1.摘要 学习Redis的时候,我有个疑问:Redis缓存是内存数据库,但是它部署在独立的一个服务器上,那么应用服务器访问redis不是要通过网络吗,那么是不是还不如从本地服务器读取数据库的效率 ?结论是&#xff1a…

[图像处理] 基于CleanVision库清洗图像数据集

CleanVision是一个开源的Python库,旨在帮助用户自动检测图像数据集中可能影响机器学习项目的常见问题。该库被设计为计算机视觉项目的初步工具,以便在应用机器学习之前发现并解决数据集中的问题。CleanVision的核心功能包括检测完全重复、近似重复、模糊…

ML 系列:机器学习和深度学习的深层次总结(17)从样本空间到概率规则概率

一、说明 概率是支撑大部分统计分析的基本概念。从本质上讲,概率提供了一个框架,用于量化不确定性并对未来事件做出明智的预测。无论您是在掷骰子、预测天气还是评估金融市场的风险,概率都是帮助您驾驭不确定性的工具。本篇将讲授概率的原理和…