【JavaEE初阶 — 多线程】认识线程

 fa332e6b5fec4df2a98be63259f6d758.gif

5cdff5ae3eb14ed1bc1a633990d71f91.jpeg

  69b4581b49af4c69a2678906fb5a880f.gif

目录

认识线程(Thread)

1 线程是什么?

2 为什么要有线程

3 进程和线程的区别

区别一

区别二

区别三

区别四

4. Java的线程和操作系统线程的关系

5.创建第一个多线程程序

引入Thread类

重写run()

start()与run()区别

降低多线程对CPU的占用率

 处理sleep()异常

线程的随机调度

6.使用 jconsole 命令观察线程


 


 

认识线程(Thread)


1 线程是什么?


  • 一个线程就是一个 "执行流"。
  • 每个线程之间都可以按照顺序执行自己的代码. 多个线程之间 "同时" 执行着多份代码。
  • 将一个大任务分解成不同小任务,交给不同执行流分别排队执行。

2 为什么要有线程


 

d9504f19322e4438aee1867ddfe7879b.png

 

但是在服务器开发场景上,一般情况下,客户端,服务器都在一台计算机上;但是我们可以把客户端和服务器分别放在两台电脑上。

此时我们可以通过网络的方式,远程访问mysql服务器,这也是以后工作中,最典型的一种场景

c1743ce267254d2f9c4a49e41af02fa6.png

在这种服务器的情况下,涉及一个非常关键的问题,一个服务器程序,同一时刻,是需要给多个客户端提供服务的:

8c7759f73a7148eab196b0caab64c151.png

客户端按照并发的方式,发送请求到服务器,服务器就要能对这些请求进行处理。怎么处理?

9f1dd611a0484e6fac5369f0629d90cf.png


68a91a9627c549ecae3974f0cbccc59e.png


 1a368f450e2a44318ce8ec09fdf11b86.png

dffef7adb3e446c4b0759b5f9f7ae53e.png

ead7f13283bd4584b5f2f08919f3cfef.png

094defad4842468a9dba7948092146b7.png

af36bc4ad9e143ad9f23fe6a1b77d148.png

漫画解读:

滑稽老师吃🐔,🐔是要处理的问题。而滑稽老师扮演线程,桌子扮演进程。

对于桌子上的十只🐔,适量的请几位滑稽老师来解决即可。

请的滑稽老师太多了,会因为大家都得吃🐔,又不得不彼此谦让,最后导致吃🐔效率降低。

因为线程引入过多,导致不但线程的调度开销变大,还是得效率降低。

不同桌子的🐔,由相应的滑稽老师们解决,桌子与桌子之间互不影响。

进程与进程之间资源独立,互不打扰。

线程与线程共享内存资源。

一个桌子的两个或者多个滑稽老师,抢同一只🐔,可能导致其中一个滑稽老师红温,掀桌子,导致这个桌子的滑稽老师都吃不到🐔了。

如果提前发现红温,想要掀桌子的滑稽老师,并及时劝阻,大家又能继续一起吃🐔。

总结:

引入线程,也可以解决并发编程,提高效率,同时节省开销。

但是,线程不是引入越多越好,适量的引用可以提高效率,引入太多,会因为线程调度的开销过大,反而拖慢程序的性能。

多个线程共享同一份资源,可能会产生冲突,导致线程安全问题,甚至进一步的,如果某一个线程抛出异常没有得到及时的处理,可能会带走整个进程。


3 进程和线程的区别


e46ecb9d68ef49dbb17affda9f77cbae.png

 

区别一

进程是包含线程的. 每个进程至少有一个线程存在,即主线程。

cf42a9d65c354d95bb6080f5ea4c4293.png

259a8154370042e4a68e612f21bbd7eb.png

windows 的任务管理器中,我们无法看到进程内部的线程。需要借助一些其他调试工具(VS的调试器,Windbg.....),才可以看到每个进程中的线程


区别二

进程和进程之间不共享内存空间. 同一个进程的线程之间共享同一个内存空间

3670ca429f4b47ab9a644665406998ab.png

区别三

进程是系统分配资源的最小单位,线程是系统调度的最小单位。

af3c3951c8ab473291dc9393ca5ed56a.png

为什么不能说线程共享CPU资源呢?

6d76f357a92d4877bf6b114912dafa1d.png

区别四


一个进程挂了一般不会影响到其他进程. 但是一个线程挂了, 可能把同进程内的其他线程一起带走(整个进程崩溃).

d2a50a2ac8164cf6943a30eda7275db1.png

进程与进程之间被虚线隔开,互不影响;但是在同一个进程内的多个线程,可以彼此影响。如果一个线程出现异常,当异常没有被及时捕获,而提交给JVM时,当前线程被迫终止;甚至影响多个线程,整个进程都会崩溃:

54ab441ebf244392a4e9d71499a1adc6.png

 


4. Java的线程和操作系统线程的关系

线程是操作系统中的概念。操作系统内核实现了线程这样的机制, 并且对用户层提供了一些 API, 供用户使用(例如 Linux 的 pthread 库)


5c9754c3d5844139a8934bfb81b616ff.png


通俗地讲,API就是,Java的开发大佬写了一些类或者函数,我们拿过来直接用即可。如:

2a00d2587b554ef49cae8560fcde03d1.png


Java 标准库中 Thread 类可以视为是对操作系统提供的 API 进行了进一步的抽象和封装.

64f5b0b0a5a64399b92f351826704e2e.png


5.创建第一个多线程程序


• 每个线程都是一个独立的执行流

• 多个线程之间(在一个进程内)是 "并发" 执行的


引入Thread类


引入Thread类,创建除主线程(main)外的另一个线程 t 。 

18b76b7456a04de1b18e1c0082c45ff4.png

在用Thread类的引用时,是不需要import任何包的, 因为Thread类,这个由标准库提供的API,是在java.lang文件目录底下的,idea在创建新项目时,默认已经导入了java.lang的包

5728e7693441434497291a8086894fe4.png

重写run()


我们在MyThread类中,重写父类Thread中的run方法,用自己的逻辑,替代Thread类中,run()原有的逻辑:

1174ba8d94544f30a24d42887849fa61.png

通过两个while循环,我们可以直观的感受到多线程和单线程的区别 

968ed362d23f41b589dbd3f748e55fd9.png


start()与run()区别


5c85a803b1d045e096fe632f565ba3ae.png

在完善好当前多线程程序后,屏蔽t.start(),调用t.run();对于后续的打印结果进行分析:

5b2f1fe48eba450dac5e12ee2bdeb529.png

此时,run() 是线程的入口方法,不需要手动调用。

而start() 是调用系统的API。

相当于回调函数,我们不需要关心 run() 方法的调用,线程建好后,JVM会负责调用run() 。

还学过的回调函数有,优先级队列。

我们只需要为PriorityQueue传入比较器Comparator,只需要把比较的逻辑,写入比较器中的方法即可,不需要关心比较器里面的方法什么时候被调用。


降低多线程对CPU的占用率


此时,main 线程 和 t 线程 并发执行,会比单线程运行效率更高,CPU会以更高的频率(功率)工作,产生更多的热量;

此时CPU为了散热,会降低运行频率,从而CPU运行效率降低。

fa00a436c7004c389fad3c733722760d.png

在两个while循环中,我们调用Thread类提供的一个静态方法sleep(),参数为毫秒;

调用类的静态属性,不需要通过类名实例化一个对象,再通过对象的引用调用属性;而是直接通过类名调用静态属性;

而通过Thread类,两次调用sleep(),可以让当前线程暂时放弃CPU,降低CPU占用率。


 处理sleep()异常


再来分析两处地方,对sleep()进行调用报错的原因。

8d5258d61df3440aaed0167914065d33.png

报错原因,是因为我们并没有捕获异常

d6bc7bcd32474fb2865905404fe66a59.png


对于这两处关于调用sleep()的报错:

5784d862cdbc4e2c966cb2d7f70daca1.png

第一处报错的解决方案,只有通过try...catch来捕获异常,而不是在run()后面throw异常;

因为run(),是Thread类的run()的重写方法;在Thread类中的run,并没有在方法名后throw异常;

2e02550a9f4a4c0489fbbc0a31d8638a.png

重写的方法的方法名,方法参数,抛出的异常都得和父类中的一致,因为这些限制,我们不能在run() 后 throws 异常,但是main方法可以。

4eda08506f194da197109b93981002fb.png

但是,上述两种处理sleep()异常的方式,并没有对异常本身的问题进行任何的处理,在实际开发中,我们处理异常的方式如下:

f15cce542f3c4bd2ace480be7ea5fe67.png


线程的随机调度


观察程序运行结果,对于先打印“hello thread”还是先打印“hello main ”,并不是一定的:

828dbddb570d4325a48e14cc506e5463.png


6.使用 jconsole 命令观察线程


6ca91b2b6bd64d9fa597146a8e5032ff.png

可以借助这个工具,查看这个程序有多少个线程;

因为一个进程中,如果线程多了,可能会对程序运行产生一定的影响。因为线程调度过多,会消耗更多资源。

我们通过这个图,查看某一个时间的线程是不是特别多的问题:

db420327d43c4880ba8cb529d9112bc2.png

这就是我们看到的线程的详细信息,主要还是因为当前代码比较简单,也没有复杂的对应关系,所以看起来也没有太多的信息,但是实际上这些信息非常关键;

因为在实际工作中,我们涉及到线程会有很多个,而且里面线程的对应关系也可能很复杂。

所以当我们去排查一些问题的时候,首当其冲的,就是要先去查看,这个进程里面有什么线程,以及每个线程正在干什么。

这些都是我们排查问题,找出bug的重要依据。

9390068cdabd40689af596ff5430ab4c.png


c18f5308ec104e4a895e2781a157233e.gif

 ​​​​​​ 69b4581b49af4c69a2678906fb5a880f.gif

 

 

 

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

SpringBoot技术在商场应急管理中的创新应用

4系统概要设计 4.1概述 本系统采用B/S结构(Browser/Server,浏览器/服务器结构)和基于Web服务两种模式,是一个适用于Internet环境下的模型结构。只要用户能连上Internet,便可以在任何时间、任何地点使用。系统工作原理图如图4-1所示: 图4-1系统工作原理…

第三十四章 Vue路由进阶之声明式导航(导航高亮)

目录 一、导航高亮 1.1. 基于语法 1.2. 主要代码 二、声明式导航的两个类名 2.1. 声明式导航类名匹配方式 2.2. 声明式导航类名样式自定义 ​2.3. 核心代码 一、导航高亮 1.1. 基于语法 在Vue中通过VueRouter插件,我们可以非常简单的实现实现导航高亮效果…

基于Multisim数控直流稳压电源电路(含仿真和报告)

【全套资料.zip】数控直流稳压电源电路设计Multisim仿真设计数字电子技术 文章目录 功能一、Multisim仿真源文件二、原理文档报告资料下载【Multisim仿真报告讲解视频.zip】 功能 1.输出直流电压调节范围5-12V。 2.输出电流0-500mA。 3.输出直流电压能步进调节,步…

3D Gaussian Splatting 入门

1 摘要 3D Gaussian Splatting是一种将点云表示为高斯分布(Gaussian Distributions)的方法,用于3D重建、渲染等领域。这种方法通过在3D空间中对点云进行参数化,使得每个点不仅有位置(XYZ坐标),还…

快速遍历包含合并单元格的Word表格

Word中的合并表格如下,现在需要根据子类(例如:果汁)查找对应的品类,如果这是Excel表格,那么即使包含合并单元格,也很容易处理,但是使用Word VBA进行查找,就需要一些技巧。…

微服务系列四:热更新措施与配置共享

目录 前言 一、基于Nacos的管理中心整体方案 二、配置共享动态维护 2.1 分析哪些配置可拆,需要动态提供哪些参数 2.2 在nacos 分别创建共享配置 创建jdbc相关配置文件 创建日志相关配置文件 创建接口文档配置文件 2.3 拉取本地合并配置文件 2.3.1 拉取出现…

抖音短剧小程序上线:短视频平台的全新娱乐体验

抖音短剧小程序的开发是一个结合了创意与技术的过程,旨在通过简洁而富有吸引力的方式,向用户提供高质量的短剧内容。随着移动互联网的快速发展,短视频平台成为了人们日常生活中不可或缺的一部分,而短剧作为一种新兴的内容形式&…

【解决】Ubuntu18.04 卸载python之后桌面异常且终端无法打开,重启后进入tty1,没有图形化界面

我因为python版本太过于混乱 (都是为了学习os) ,3.6—3.9版本我都安装了,指向关系也很混乱,本着“重装是最不会乱”的原则,我把全部版本都卸载了。然后装了3.9 发现终端打不开了,火狐浏览器的图…

Golang | Leetcode Golang题解之第521题最长特殊序列I

题目: 题解: func findLUSlength(a, b string) int {if a ! b {return max(len(a), len(b))}return -1 }func max(a, b int) int {if b > a {return b}return a }

【英特尔IA-32架构软件开发者开发手册第3卷:系统编程指南】2001年版翻译,2-13

文件下载与邀请翻译者 学习英特尔开发手册,最好手里这个手册文件。原版是PDF文件。点击下方链接了解下载方法。 讲解下载英特尔开发手册的文章 翻译英特尔开发手册,会是一件耗时费力的工作。如果有愿意和我一起来做这件事的,那么&#xff…

二叉树中的深搜 算法专题

二叉树中的深搜 一. 计算布尔二叉树的值 计算布尔二叉树的值 class Solution {public boolean evaluateTree(TreeNode root) {if(root.left null) return root.val 0? false: true;boolean left evaluateTree(root.left);boolean right evaluateTree(root.right);return…

VisionPro —— CogPatInspectTool对比工具

一、CogPathInspectTool工具简介 CogPathInspectTool是VisionPro重要的工具,主要用于缺陷检测,通过将当前图像与“训练图像”对比,获取“原始差异图像”,再将“原始差异图像”与“阈值图像”进行对比,进而获取“阈值差…

Linux 系统启动

1.Linux系统启动过程 Linux系统启动过程可以分为5个阶段:内核的引导、运行 init、系统初始化、建立终端、用户登录系统。 2.内核引导 当计算机打开电源后,首先是BIOS开机自检,按照BIOS中设置的启动设备(通常是硬盘)来启…

Qt 坐标系统与坐标变换

Qt 坐标系统与坐标变换 坐标变换函数 QPainter坐标变换相关函数 分组函数原型功能坐标变换void translate(qreal dx,qreal dy)坐标系统一定的偏移量,坐标原点平移到新的点void rotate(qreal angle)坐标系统顺时针旋转-一个角度void scale(qreal sx,qreal sy)坐标…

奥数与C++小学四年级(第十六题 魔法学院)

参考程序代码&#xff1a; #include <iostream>int main() {int maxStudentsPerSubject 9; // 每个科目最多有9个比哈利高的学生int students maxStudentsPerSubject * 3; // 三个科目// 加上哈利自己int totalStudents students 1;std::cout << "最大学…

高空作业未系安全带监测系统 安全带穿戴识别预警系统

在各类高空作业场景中&#xff0c;安全带是保障作业人员生命安全的关键防线。然而&#xff0c;由于人为疏忽或其他原因&#xff0c;作业人员未正确系挂安全带的情况时有发生&#xff0c;这给高空作业带来了巨大的安全隐患。为有效解决这一问题&#xff0c;高空作业未系安全带监…

备战“双11”丨AI+物流:你的快递会有什么变化?

背景 在中国&#xff0c;每天有数以亿计的包裹在运输&#xff0c;尤其在电商促销季如“双十一”、“618”期间&#xff0c;快递量更是激增。快递物流行业面临人员短缺、配送效率低下和物流承载能力有限等问题。快瞳科技提供的AI识别解决方案通过智能化手段提高工作效率和配送准…

Cesium的PickModel浅析

Cesium中的拣选(pick)具备一套比较巧妙机制&#xff0c;。可以简单的认为&#xff0c;Cesium的常规的鼠标拣选是基于最终成图做的。就如同下面的这幅画&#xff0c;红色的箭头指向牛的臀&#xff0c;而不是后面的房子&#xff0c;是因为牛挡住了房子。这是一种比较自然的理解方…

针对告警数量、告警位置、告警类型等参数进行统计,并做可视化处理的智慧能源开源了

一、简介 AI视频监控平台, 是一款功能强大且简单易用的实时算法视频监控系统。愿景在最底层打通各大芯片厂商相互间的壁垒&#xff0c;省去繁琐重复的适配流程&#xff0c;实现芯片、算法、应用的全流程组合&#xff0c;减少企业级应用约 95%的开发成本&#xff0c;在强大视频算…

【教学类-12-10】20241104《连连看竖版6*6 (3套题目空心图案)中2班

【教学类-12-09】20230228《连连看竖版6*6 &#xff08;3套题目空心图案&#xff08;中班教学&#xff09;》&#xff08;中班主题《玩具总动员》)-CSDN博客文章浏览阅读121次。【教学类-12-09】20230228《连连看竖版6*6 &#xff08;3套题目空心图案&#xff08;中班教学&…