【Java EE】多线程(一)

在这里插入图片描述

📚博客主页:爱敲代码的小杨.

✨专栏:《Java SE语法》 | 《数据结构与算法》 | 《C生万物》 |《MySQL探索之旅》 |《Web世界探险家》

❤️感谢大家点赞👍🏻收藏⭐评论✍🏻,您的三连就是我持续更新的动力❤️

🙏小杨水平有限,欢迎各位大佬指点,相互学习进步!

文章目录

  • 1. 进程和多线程的概念
    • 1.1 进程
    • 1.2 线程
  • 2. 并发和并行
    • 2.1 并发
    • 2.2 并行
  • 3. 多线程的实现方式
    • 3.1继承 Thread 类
    • 3.2 实现 Runnale 接口
    • 3.3 其他形式

1. 进程和多线程的概念

1.1 进程

提到多线程就不得不提及“进程”这个概念。
进程:进程是操作系统结构的基础;是一次程序的执行;是一个程序及其数据在处理机上顺序执行时发生的活动;在程序在一个数据集合上运行的过程,它是系统进行资源分配和调度的一个独立单位。
举例:
image.png
我们可以将一个正在操作系统中运行的.exe程序理解成进程,进程是受操作系统管理的基本运行单元.

1.2 线程

线程:线程就可以理解成是在进程中独立的子任务。
多线程:多线程指的就是一个 .exe 程序同时执行多个子任务
image.png

举例:
运行QQ.exe时就有很多子任务在同时运行。比如:好友视频线程、下载文件线程、传输数据线程、发送表情线程等等,这些不同任务或者功能都可以同时运行,其中每一项任务完全可以理解成理“线程”在工作,传文件,发送图片表情等能有对应的线程在后台默默运行。

多线程的优点:使用多任务操作系统 Windows 后,可以最大限度地利用 CPU 的空闲时间处理其他的任务,比如一边让操作系统处理正在由打印机打印的数据,一般使用 Word 编辑文档。而 CPU 在这些任务之间不停地切换,由于切换的速度非常快,给使用者的感受就是这些任务似乎在同时运行。所以使用多线程技术后,可以在同一时间运行更多不同种类的任务。

小结:

  1. 有了多线程,我们就可以让程序同时做多件事情
  2. 多线程的作用:提高效率
  3. 多线程的应用场景:只要你想让多个事情同时运行就需要多线程,比如:软件中的消耗操作、所有的聊天软件、所有的服务器。

2. 并发和并行

2.1 并发

并发:在同一个时刻,有多个指令在单个 CPU 上交替执行

举例:我在打游戏的时候。又想喝可乐,于是我的右手一会拿鼠标,一会拿可乐,那么此时由于我的手速非常的快,在鼠标和可乐之间来回交替执行,此时我们就可以看作是并发,这里右手就是当做 CPU,鼠标和可乐就当做线程1和线程2,CPU 就是在这两条线程之间进行交替执行

红色的线比做 CPU ,蓝色的线比做 线程。
PixPin_2024-03-31_15-35-15.gif

2.2 并行

并行:在同时一个时刻,有多个指令在多个 CPU 上同时执行
image.png
红色的线比做 CPU ,蓝色的线比做 线程。
image.png
有人会疑问了我们的电脑上不是只有一个 CPU?为啥上图有两个 CPU 呢?
但是我们的电脑的 CPU 可以分为:2核4线程、4核8线程、8核16线程、16核32线程、32核64线程等等。这里线程的数量就是电脑能同时运行的线程。

这里我们用2核心4线程举例:
它可以同时运行4条线程,所以如果你的电脑当中只有4条线程,那么它就可以不用切换的,但是如果线程越来越多,那么这4条红线就会在多个线程之间随机的进行切换,所以在计算机中并发和并行有可能同时都在发生的

3. 多线程的实现方式

3.1继承 Thread 类

步骤:

  1. 定义类继承 Thread
  2. 重写 run方法
  3. 创建实例
  4. 启动线程

代码:

// 1.继承 Thread类
class MyThread extends Thread{// 2. 重写 run方法@Overridepublic void run() {// 线程代码while (true) {System.out.println("hello thread");// sleep方法:休眠try {Thread.sleep(1000);} catch (InterruptedException e) {throw new RuntimeException(e);}}}
}public class Test {public static void main(String[] args) {// 3. 创建实例MyThread t = new MyThread();// 4.启动线程 t.start();while (true) {System.out.println("hello main");try {Thread.sleep(1000);} catch (InterruptedException e) {throw new RuntimeException(e);}}}
}

运行结果:
recording.gif
【注意】:多线程是异步的,所以千万把 idea 里代码的顺序当成线程执行的顺序,线程被调用的时机是随机的。

3.2 实现 Runnale 接口

步骤:

  1. 实现 Runnale 接口
  2. 重写 run 方法
  3. 创建实例,调用 Thread 的构造方法时将 Runnable 对象作为 target 参数
  4. 启动线程

代码:

// 1. 实现Runnable 接口
class MyRunnable implements Runnable {// 重写 run 方法@Overridepublic void run() {while (true) {System.out.println("hello Thread");try {Thread.sleep(1000);} catch (InterruptedException e) {throw new RuntimeException(e);}}}
}public class Test3 {public static void main(String[] args) {// 3. 创建实例,调用 Thread 的构造方法时将 Runnable 对象作为 target 参数Thread t = new Thread(new MyRunnable());// 4. 启动线程t.start();while (true) {System.out.println("hello main");try {Thread.sleep(1000);} catch (InterruptedException e) {throw new RuntimeException(e);}}}
}

运行结果
recording.gif

3.3 其他形式

  • 匿名内部类创建 Thread 子类对象

​ 代码:

public class Test4 {public static void main(String[] args) {new Thread(){@Overridepublic void run() {while (true) {System.out.println("hello Thread");try {Thread.sleep(1000);} catch (InterruptedException e) {throw new RuntimeException(e);}}}}.start();while (true) {System.out.println("hello main");try {Thread.sleep(1000);} catch (InterruptedException e) {throw new RuntimeException(e);}}}
}

​ 运行结果:
recording.gif

  • 匿名内部类创建 Runable 子类对象

​ 代码:

public class Test5 {public static void main(String[] args) {new Thread(new MyRunnable()) {@Overridepublic void run() {while (true) {System.out.println("hello Thread");try {Thread.sleep(1000);} catch (InterruptedException e) {throw new RuntimeException(e);}}}}.start();while (true) {System.out.println("hello main");try {Thread.sleep(1000);} catch (InterruptedException e) {throw new RuntimeException(e);}}}
}

​ 运行结果:
recording.gif

  • lambda 表达式创建 Runnable 子类对象

​ 代码:

public class Test6 {public static void main(String[] args) {Thread t =  new Thread(() -> {while (true) {System.out.println("hello Thread");try {Thread.sleep(1000);} catch (InterruptedException e) {throw new RuntimeException(e);}}});t.start();while (true) {System.out.println("hello main");try {Thread.sleep(1000);} catch (InterruptedException e) {throw new RuntimeException(e);}}}
}

​ 运行结果:
recording.gif

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

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

相关文章

Mac OS上使用matplotlib库显示中文字体

文章目录 问题描述解决步骤参考文章 问题描述 如果我们想要使用matplotlib画图的话,可能会出现下面的这种warning: UserWarning: Glyph 24212 (\N{CJK UNIFIED IDEOGRAPH-5E94}) missing from current font.解决步骤 解决这个问题,可以按照下面的做法…

Excel求解二元一次方程

背景:如果想求解二元一次方程,常规方法就是联立方程求出一个未知数,然后带入任意一个等式。那么在excel里面应该怎么解决呢? 总所周知,大学里面会学矩阵行列式,二元一次方程其实就是一个简单的矩阵行列式。…

【云开发笔记No.19】关于中台架构(1)

在云开发领域,中台架构是一种至关重要的组织架构,它为企业提供了一种灵活且高效的方式来应对市场的快速变化。下面将详细阐述中台架构的定义、起源、定位和价值。 中台架构的定义 中台架构是指在企业信息系统中,将业务流程、数据和应用系统…

2024.3.31力扣(1200-1400)刷题记录

一、1523. 在区间范围内统计奇数数目 1.模拟 class Solution:def countOdds(self, low: int, high: int) -> int:# 模拟return len(range(low,high1,2)) if low & 1 else len(range(low1,high1,2)) 2.数学 总结规律。首为偶数就向下取整;奇数就向上取整。…

洛谷P1083 借教室(二分,差分)

题目描述 在大学期间,经常需要租借教室。大到院系举办活动,小到学习小组自习讨论,都需要向学校申请借教室。教室的大小功能不同,借教室人的身份不同,借教室的手续也不一样。 面对海量租借教室的信息,我们…

复现黄金票据

一、搭建环境 搭建域环境可以点击这个查看步骤 在这里面monowall的配置查看 二、实验步骤 拿到域名 拿到SID 使用mimikatz拿到krbtgt用户的哈希 删除票据 也可以使用mimikatz.exe删除票据,命令是kerberos::purge 伪造票据 拿到域控 伪造成功

回顾

cmd的操作方法:dir 查看当前路径下的内容 cd 进入目录 cd..回退到上一次进 cd \ 1 \2只有进入深入目录才需要打斜杠否则不用 命令行打开软件切换到(一般情况bin)的软件名称.exe 指定什么格式输入什么内容否则相当于输入不进去 %c 字符 %d 整形 分隔成两个代码假…

字符串(java)

字符串的特点: 1.String是java定义好的一个类,定义在java.lang包里面,所以使用的时候是不需要进行导包的 2.java程序中的所有字符串文字,都被实为此类的对象。也就是说当我们就算是进行赋值,这个也会创造…

机器视觉系统-分辨率、信噪比、动态范围

分辨率:其他条件相同时,分辨率越大,图像越清晰。分辨率如640480, 1024768, 20481536等。 信噪比:信号与噪声的比值,信噪比越高图像的质量越高。 动态范围:表示图像中所包含的从“最暗”至“最亮”的范…

数码视讯Q7盒子刷armbian或emuelec的一些坑

首先,我手头的盒子是nand存储的,如果是emmc的,会省事很多…… 以下很多结论是我的推测,不一定准确。 1,原装安卓系统不支持SD卡或U盘启动,所以只能进uboot修改启动参数 2,原装安卓系统应该是…

YOLOv8改进 | 低照度检测 | 2024最新改进CPA-Enhancer链式思考网络(适用低照度、图像去雾、雨天、雪天)

一、本文介绍 本文给大家带来的2024.3月份最新改进机制,由CPA-Enhancer: Chain-of-Thought Prompted Adaptive Enhancer for Object Detection under Unknown Degradations论文提出的CPA-Enhancer链式思考网络,CPA-Enhancer通过引入链式思考提示机制&am…

(1)半导体设备之sorter机(上)

01、什么是sorter 其实sorter 就是分选机,大家日常生活买的土豆,苹果,会用到这个, 大家日常用的硬币,游戏币,都是用sorter来进行挑选的,否则人工数硬币又累又苦逼,钱再对不上号&…

【JavaScript】函数 ② ( 函数参数 | 形式参数 | 实际参数 )

文章目录 一、JavaScript 函数参数1、形式参数2、实际参数3、代码示例 - 形参和实参 一、JavaScript 函数参数 在 JavaScript 语言中 , 参数 分为以下两种 : 形式参数 Parameter , 简称 " 形参 " , 是 在函数定义时列出的变量 , 用于预期函数将接收的输入值 ;实际参…

计算机网络-从输入网址到访问网站的全过程

当我们在浏览器中输入一个网址并按下回车键时,会发生一系列复杂的过程,最终使我们能够看到网页的内容。以下是这个过程的详细步骤: 客户端:首先,用户在浏览器中键入网址,然后浏览器会根据这个网址生成一个H…

(delphi11最新学习资料) Object Pascal 学习笔记---第8章第4节(延迟绑定和多态性)

8.4.2 延迟绑定和多态性 ​ Object Pascal 函数和过程通常基于静态绑定,也称为早期绑定。这意味着方法调用是在编译或链接时解决的。面向对象编程语言允许延迟绑定或动态绑定,即根据用于调用的实例类型在运行时确定要调用的方法。 ​ 这种技术的优势被…

动态规划(Dynamic programming)详解(含代码)

动态规划(Dynamic Programming, DP)是一种有效的计算机算法设计技术,主要用于解决具有重叠子问题和最优子结构特征的问题,这些问题是无法直接得出最优解,但可以通过求解其各个子问题的最优解来构造原问题的最优解。动态…

ER图与关系模型

1、试画出数据库系统的三级模式结构图。 2、试画出数据库系统的组成图。 3、学校运动会有来自全校各学院运动员组成的代表团参赛各类竞赛项目。一个 代表团由多名运动员组成;一个运动员可以参加不同项目的比赛,而一个竞赛项目允许多名运动员参赛。为了…

ADB(Android Debug Bridge)操作命令详解及示例

ADB(Android Debug Bridge)是一个强大的命令行工具,它是Android SDK的一部分,主要用于Android设备(包括真实手机和平板电脑以及模拟器)的调试、系统控制和应用程序部署。 下面是一些ADB的常用命令&#xff…

【力扣】200.岛屿数量(染色法DFS深搜)

岛屿数量 题目描述 链接:力扣:200.岛屿数量 给你一个由 1(陆地)和 0(水)组成的的二维网格,请你计算网格中岛屿的数量。 岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆…

小程序开发调试指南

调试指南 一、Vconsole 一些线上问题需要在真机中进行调试或日志输出,为方便查看前端日志的输出,App 端提供了调试模式, 打开调试模式后面板界面中会显示 vConsole 按钮,点击后可打开手机端 vConsole界面查看日志输出。 1.如何开启 点击小…