当前位置: 首页 > news >正文

java 21 多线程

1.相关概念
进程:

进程是指运行中的程序,比如我们使用QQ,就启动了一个进程,操作系统就会为该进程分配内存空间。当我们使用迅雷,又启动了一个进程,操作系统将为迅雷配新的内存空间。
进程是程序的一次执行过程,或是正在运行的一个程序。是动态过程:有它自身的产生、存在和消亡的过程

 线程:

线程是由进程创建的。是进程的一个实体;一个进程可以有多个线程;

Java 中线程被认为是一个CPU、程序代码、和数据的封装体。java.lang.Thread类使用户可以创建和控制自己的线程。在Java中,虚拟CPU是自动封装进Thread类的实例中,而Code和Data要通过一个对象传给Thread类的构造函数

        单线程:同一个时刻,只允许执行一个线程

        多线程:同一个时刻,可以执行多个线程

并发:

同一个时刻,多个任务交替执行 单核cpu实现的多任务就是并发 (造成一种“貌似同时”的错觉)

并行:

同一个时刻,多个任务同时执行。多核cpu可以实现并行

java从语言级别支持多线程  比如object中的wait(),notify()

线程体

线程的Code和Data构成线程体。线程体决定了线程的行为

通过run()方法来实现的 线程启动后系统就自动调用run()方法,通常,run方法执行了一个时间较长的操作

2.对线程的基本控制
a. 线程的启动: start()方法 

该方法的调用把嵌入在线程中的虚拟CPU置为可运行(Runnable)状态。Runnable状态意味着该线程可以参加调度,被JVM运行,并不意味着线程会立即执行

b.线程的结束:

设定一个标记变量,以结束相应的循环及方法

通知线程退出:

package xiancheng;
public class ThreadExit {public static void main(String[] args) throws InterruptedException {Cat1 cat = new Cat1();cat.start();//如果希望main线程去控制t1 线程的终止,必须可以修改loop// 让t1 退出run方法,从而终止t1线程->通知方式//让主线程休眠10秒,再通知t1线程退出System.out.println("main线程休息10s");Thread.sleep(10*1000);cat.setLoop(false);}
}
class Cat1 extends Thread{int times = 0;private boolean loop = true;@Overridepublic void run(){while (loop){System.out.println("11"+(++times)+Thread.currentThread().getName());//让该线程休眠一秒try {Thread.sleep(1000);} catch (InterruptedException e) {throw new RuntimeException(e);}if(times ==5){break;}}}public void setLoop(boolean loop) {this.loop = loop;}
}

暂时阻止线程的执行:

try {Thread.sleep(1000);
} catch (InterruptedException e) {throw new RuntimeException(e);
}

c.设定线程的优先级

d.线程分类

 

 

package xiancheng;import java.util.*;
public class TestThreadDaemon {public static void main(String args[]) {Thread t = new MyThread();t.setDaemon(true);t.start();
//主线程结束后 t也结束  将子线程设置成守护线程System.out.println( "Main--" + new Date());try{ Thread.sleep(500); }catch(InterruptedException ex){}System.out.println("Main End");}
}class MyThread extends Thread {public void run() {for(int i=0; i<10; i++ ){System.out.println(  i + "--" + new Date());try{ Thread.sleep(100); }catch(InterruptedException ex){}}}
}//输出:
//Main--Wed Dec 04 19:01:01 CST 2024
//0--Wed Dec 04 19:01:01 CST 2024
//1--Wed Dec 04 19:01:01 CST 2024
//2--Wed Dec 04 19:01:01 CST 2024
//3--Wed Dec 04 19:01:02 CST 2024
//4--Wed Dec 04 19:01:02 CST 2024
//Main End
3.线程常用方法
a.第一组:

 

Thread 类的静态方法currentThread( )返回当前线程。 

当线程的状态未知时,用isAlive( )确定线程是否活着。返回true 意味着线程已经启动,但还没有运行结束。

sleep方法:该方法用来使一个线程暂停运行一段固定的时间。在线程睡眠时间内,将运行别的线程。 sleep( ) 结束后,线程将进入Runnable状态。

b.第二组

 

package xiancheng;public class Threadjoin {public static void main(String[] args) throws InterruptedException {T3 t3 = new T3();t3.start();for (int i = 0; i <=6; i++) {Thread.sleep(1000);System.out.println("main————"+i);if(i==3){System.out.println("主线程执行3次了,就让子线程先执行(之前是同时执行的)");t3.join();System.out.println("子线程执行完了,主线程继续执行");}}}
}
class T3 extends Thread{@Overridepublic void run(){for (int i = 0; i <6 ; i++) {try {Thread.sleep(1000);} catch (InterruptedException e) {throw new RuntimeException(e);}System.out.println("子线程————————"+i);}}
}//子线程————————0
//main————0
//main————1
//子线程————————1
//子线程————————2
//main————2
//子线程————————3
//main————3
//主线程执行3次了,就让子线程先执行(之前是同时执行的)
//子线程————————4
//子线程————————5
//子线程执行完了,主线程继续执行
//main————4
//main————5
//main————6
//
//Process finished with exit code 0

 

4.创建线程
        a.继承Thread类

package xiancheng;public class Thread01 {public static void main(String[] args) throws InterruptedException {Cat cat = new Cat();cat.start();//启动线程  会启动Cat的run方法//main线程启动一个子线程 Thread-0,主线程不会阻塞,会继续执行//主线程和子线程交替执行System.out.println("主线程会继续执行"+Thread.currentThread().getName());for (int i = 0; i <10 ; i++) {System.out.println("主线程 i ="+i);Thread.sleep(1000);}}}
//1.当一个类继承了Thread类,该类就可以当成线程使用
//2.重写run方法,写上自己的代码
//3. run() 是Thread类实现了Runnable接口的run方法
class Cat extends Thread{int times = 0;@Overridepublic void run(){while (true){System.out.println("11"+(++times)+Thread.currentThread().getName());//让该线程休眠一秒try {Thread.sleep(1000);} catch (InterruptedException e) {throw new RuntimeException(e);}if(times ==5){break;}}}
}
         b.Runnable接口

一个线程就是Thread类的一个实例

package xiancheng;public class Thread02 {public static void main(String[] args) {Dog dog = new Dog();//dog.start();//不能调用该方法//创建Thread对象,把Dog对象(实现Runable接口),放入ThreadThread thread = new Thread(dog);thread.start();}
}
class Dog implements Runnable{int count = 0;public void run(){while (true){System.out.println("hi" + (++count)+Thread.currentThread().getName());//休眠一秒try {Thread.sleep(1000);} catch (InterruptedException e) {throw new RuntimeException(e);}if(count ==10){break;}}}
}
        c.多线程案列
package xiancheng;public class Thread03 {public static void main(String[] args) {T1 t1 = new T1();T2 t2 = new T2();Thread th1 = new Thread(t1);Thread th2 = new Thread(t2);th1.start();//启动第一个线程th2.start();//启动第二个线程}
}
class T1 implements Runnable{int count = 0;@Overridepublic void run() {//每隔一秒输出hewhile (true){System.out.println("he"+"|"+(++count));try {Thread.sleep(1000);} catch (InterruptedException e) {throw new RuntimeException(e);}if(count ==10){break;}}}
}
class T2 implements Runnable{int count = 0;@Overridepublic void run() {//每隔一秒输出hewhile (true){System.out.println("hello"+"|"+(++count));try {Thread.sleep(1000);} catch (InterruptedException e) {throw new RuntimeException(e);}if (count==10) {break;}}}
}
5.线程的生命周期

6.线程的同步 

线程同步机制
在多线程编程,一些敏感数据不允许被多个线程同时访问,此时就使用同步访问技术,保证数据在任何同一时刻,最多有一个线程访问,以保证数据的完整性。
也可以这里理解:线程同步,即当有一个线程在对内存进行操作时,其他线程都不可以对这个内存地址进行操作,直到该线程完成操作,其他线程才能对该内存地址进行操作。

同步的具体方法——Synchronized

a.同步代码块

Synchronized(对象){得到对象的锁才能操作同步代码}  锁加在this对象上默认情况下

b.Synchronized放在方法声明中,相当于Synchronized(this),表示整个方法为同步方法

public Synchronized void m (String name){//需要被同步的代码} 在同一时刻,只能有一个线程来执行该方  锁加在this对象上

互斥锁

 

要求多个线程的锁对象为同一个!!

线程的死锁:

多个线程都占用了对方的锁资源,但不肯相让,导致了死锁,在编程是一定要避免死锁的发生.

package xiancheng;class Worker
{int id;public Worker(int id){ this.id=id; }synchronized void doTaskWithCooperator(Worker other){try{ Thread.sleep(500); } catch(Exception e){}synchronized(other){System.out.println("doing" + id);}}
}class DeadLockDemo{public static void main(String[] args) {Worker w1 = new Worker(1);Worker w2 = new Worker(2);Thread td1 = new Thread(()->{w1.doTaskWithCooperator(w2);});Thread td2 = new Thread(()->{w2.doTaskWithCooperator(w1);});td1.start();td2.start();}
}
//在方法内部,首先使用Thread.sleep(500)让当前线程休眠 500 毫秒,
// 然后又嵌套了一个synchronized块,它以传入的另一个Worker对象other作为锁对象。
// 在这个内部的synchronized块中,只是简单地输出了当前Worker对象的id值,表示正在执行相关任务。
//这里存在产生死锁的隐患,因为它获取了自身实例对应的锁(方法级别的synchronized隐式锁)后,
// 又尝试去获取另一个Worker实例对应的锁(通过synchronized(other)),
// 如果多个线程以交叉的方式去获取锁,就可能导致死锁情况发生。
释放锁:

1.当前线程的同步方法、同步代码块执行结束

2.同步方法中遇到break、return
3.当前线程在同步代码块,同步方法中出现了未处理的Error或Exception,导致异常结束

4.同步方法中执行了线程对象的wait()方法,当前线程暂停,并释当前线程在同步代码块、放锁。

线程执行同步代码块或同步方法时,程序调用Thread.sleep()、Thread.yield()方法暂停当前线程的执行,不会释放锁
线程执行同步代码块时,其他线程调用了该线程的suspend()方法将该线程挂起该线程不会释放锁。

相关文章:

java 21 多线程

1.相关概念 进程: 进程是指运行中的程序&#xff0c;比如我们使用QQ&#xff0c;就启动了一个进程&#xff0c;操作系统就会为该进程分配内存空间。当我们使用迅雷&#xff0c;又启动了一个进程&#xff0c;操作系统将为迅雷配新的内存空间。 进程是程序的一次执行过程&#…...

Rust学习笔记_07——枚举和范围

Rust学习笔记_04——引用 Rust学习笔记_05——控制流(1) Rust学习笔记_06——控制流(2) 文章目录 1. 枚举1.1基础1.2 给枚举变体起个“别名”1.3 枚举与匹配&#xff08;match&#xff09; 2. 范围2.1 介绍2.2 半开区间范围2.3 包含范围的语法糖2.4 步长范围&#xff08;Range …...

40分钟学 Go 语言高并发:服务性能调优实战

服务性能调优实战 一、性能优化实战概述 优化阶段主要内容关键指标重要程度瓶颈定位收集性能指标&#xff0c;确定瓶颈位置CPU、内存、延迟、吞吐量⭐⭐⭐⭐⭐代码优化优化算法、并发、内存使用代码执行时间、内存分配⭐⭐⭐⭐⭐系统调优调整系统参数、资源配置系统资源利用率…...

Windows通过指令查看已安装的驱动

Windows通过指令查看已安装的驱动 在 Windows 操作系统中&#xff0c;有几种命令可以用来查看已安装的驱动程序。以下是常见的几种方法&#xff1a; 1. 使用 pnputil 查看已安装驱动程序 pnputil 是一个 Windows 内置工具&#xff0c;可以列出所有已安装的驱动程序包。 命令…...

Windows 11 如何配置node.js

一&#xff0c;官网下载 官网首页 下载最新LTS版本&#xff0c;比较稳定&#xff0c;如果想探索更新的版本去探索新的nodejs功能。 1. 下载完成后&#xff0c;双击运行程序&#xff0c;点击next 2. 勾选接受协议&#xff0c;点击next 3. 选择自己的安装路径&#xff08;默认是…...

AWTK fscript 中的 串口 扩展函数

fscript 是 AWTK 内置的脚本引擎&#xff0c;开发者可以在 UI XML 文件中直接嵌入 fscript 脚本&#xff0c;提高开发效率。本文介绍一下 fscript 中的 ** 串口 扩展函数 ** 1.iostream_serial_create 创建串口输入输出流对象。 原型 iostream_serial_create(device) > ob…...

yolov11剪枝

思路&#xff1a;yolov11中的C3k2与yolov8的c2f的不同&#xff0c;所以与之前yolov8剪枝有稍许不同&#xff1b; 后续&#xff1a;会将剪枝流程写全&#xff0c;以及增加蒸馏、注意力、改loss&#xff1b; 注意&#xff1a; 1.在代码105行修改pruning.get_threshold(yolo.mo…...

智慧地图聚合(LockMap)标注系统开发说明文档

智慧地图聚合(LockMap)标注系统开发说明文档 1. 系统概述 智慧地图聚合(LockMap)标注系统是一个专为处理大规模地理信息数据而设计的综合解决方案。通过后端高效的数据管理和前端直观的地图展示&#xff0c;该系统能够实现对海量地理位置点的有效可视化。本项目旨在提供一个用…...

「Mac畅玩鸿蒙与硬件36」UI互动应用篇13 - 数字滚动抽奖器

本篇将带你实现一个简单的数字滚动抽奖器。用户点击按钮后&#xff0c;屏幕上的数字会以滚动动画的形式随机变动&#xff0c;最终显示一个抽奖数字。这个项目展示了如何结合定时器、状态管理和动画实现一个有趣的互动应用。 关键词 UI互动应用数字滚动动画效果状态管理用户交…...

cuda12.1版本的pytorch环境安装记录,并添加到jupyter和pycharm中

文章目录 前置准备使用anaconda prompt创建虚拟环境创建虚拟环境激活pytorch虚拟环境把pytorch下载到本地使用pip把安装包安装到pytorch环境中进入python环境检验是否安装成功将环境添加到jupyter在pycharm中使用该环境&#xff1a; 前置准备 安装anaconda&#xff0c;我的版本…...

Linux: network: nic: mellanox MRU初现

文章目录 在PPP协议了有提到过总结-吐槽MRU初现兼容问题详细的MRU的计算幸运下面这个commit缩小了幸运机会So在PPP协议了有提到过 MRU在RFC4638里有提到。但是在Linux内核里是的Ethernet是没有相关的概念。 总结-吐槽 说Mellanox的网卡驱动在2018年做了一个对进入packet的大…...

深入理解红黑树的底层逻辑

一、红黑树的定义 红黑树是一种自平衡的二叉查找树&#xff0c;每个节点都带有额外的颜色信息&#xff0c;可以是红色或黑色。红黑树的目的是通过引入颜色信息来确保树的平衡&#xff0c;从而提高查找、插入和删除等操作的效率。 二、红黑树的性质 每个节点都有颜色&#xf…...

【数据结构】手搓链表

一、定义 typedef struct node_s {int _data;struct node_s *_next; } node_t;typedef struct list_s {node_t *_head;node_t *_tail; } list_t;节点结构体&#xff08;node_s&#xff09;&#xff1a; int _data;存储节点中的数据struct node_s *_next;&#xff1a;指向 node…...

ThinkPHP场景动态验证

一、缘由 今天在用thinkphp8写东西的时候发现&#xff0c;写验证器规则和场景优点费时间&#xff0c;就算用tinkphp的命令行生成也是生成一个空壳。内容还是要自己填写感觉麻烦。 就突发奇想能不能自动生成验证器&#xff0c;也不能是说自动生成验证器&#xff0c;生成验证其的…...

在M3上面搭建一套lnmp环境

下载docker-desktop 官网下载docker-desktop 切换镜像源 {"builder": {"gc": {"defaultKeepStorage": "20GB","enabled": true}},"experimental": false,"registry-mirrors": ["https://docke…...

【C++笔记】二叉搜索树

前言 各位读者朋友们大家好&#xff01;上期我们讲完了面向对象编程三大属性之一的多态&#xff0c;这一期我们再次开始数据结构二叉搜索树的讲解。 目录 前言一. 二叉搜索树的概念二. 二叉搜索树的性能分析三. 二叉搜索树的插入四. 二叉搜索树的查找五. 二叉搜索树的删除六.…...

Fork/Join框架简介

一、Fork/Join框架简介 Fork/Join框架是Java 7引入的一个用于并行执行任务的框架&#xff0c;它可以将一个大任务分割成若干个小任务&#xff0c;并行执行这些小任务&#xff0c;然后将每个小任务的结果合并起来&#xff0c;得到大任务的结果。这种框架特别适合于能够被递归分…...

Java项目实战II基于微信小程序的电子竞技信息交流平台的设计与实现(开发文档+数据库+源码)

目录 一、前言 二、技术介绍 三、系统实现 四、核心代码 五、源码获取 全栈码农以及毕业设计实战开发&#xff0c;CSDN平台Java领域新星创作者&#xff0c;专注于大学生项目实战开发、讲解和毕业答疑辅导。获取源码联系方式请查看文末 一、前言 随着互联网技术的飞速发展…...

Mysql读写分离分库分表

读写分离 什么是读写分离 读写分离主要是为了将对数据库的读写操作分散到不同的数据库节点上。 这样的话&#xff0c;就能够小幅提升写性能&#xff0c;大幅提升读性能。一般情况下&#xff0c;我们都会选择一主多从&#xff0c;也就是一台主数据库负责写&#xff0c;其他的从…...

B站狂神说--springboot项目学习(新建一个springboot项目)

文章目录 1.新建项目java8项目1.解决自带的idea2024无法使用java8的问题 2.新建接口3.项目打包为jar包4.使用jar包 1.新建项目java8项目 1.解决自带的idea2024无法使用java8的问题 将server.url修改为阿里云的地址&#xff1a;https://start.aliyun.com/ 选择Spring Web 创建…...

Mybatis逆向工程,动态创建实体类、条件扩展类、Mapper接口、Mapper.xml映射文件

今天呢&#xff0c;博主的学习进度也是步入了Java Mybatis 框架&#xff0c;目前正在逐步杨帆旗航。 那么接下来就给大家出一期有关 Mybatis 逆向工程的教学&#xff0c;希望能对大家有所帮助&#xff0c;也特别欢迎大家指点不足之处&#xff0c;小生很乐意接受正确的建议&…...

从深圳崛起的“机器之眼”:赴港乐动机器人的万亿赛道赶考路

进入2025年以来&#xff0c;尽管围绕人形机器人、具身智能等机器人赛道的质疑声不断&#xff0c;但全球市场热度依然高涨&#xff0c;入局者持续增加。 以国内市场为例&#xff0c;天眼查专业版数据显示&#xff0c;截至5月底&#xff0c;我国现存在业、存续状态的机器人相关企…...

成都鼎讯硬核科技!雷达目标与干扰模拟器,以卓越性能制胜电磁频谱战

在现代战争中&#xff0c;电磁频谱已成为继陆、海、空、天之后的 “第五维战场”&#xff0c;雷达作为电磁频谱领域的关键装备&#xff0c;其干扰与抗干扰能力的较量&#xff0c;直接影响着战争的胜负走向。由成都鼎讯科技匠心打造的雷达目标与干扰模拟器&#xff0c;凭借数字射…...

纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join

纯 Java 项目&#xff08;非 SpringBoot&#xff09;集成 Mybatis-Plus 和 Mybatis-Plus-Join 1、依赖1.1、依赖版本1.2、pom.xml 2、代码2.1、SqlSession 构造器2.2、MybatisPlus代码生成器2.3、获取 config.yml 配置2.3.1、config.yml2.3.2、项目配置类 2.4、ftl 模板2.4.1、…...

莫兰迪高级灰总结计划简约商务通用PPT模版

莫兰迪高级灰总结计划简约商务通用PPT模版&#xff0c;莫兰迪调色板清新简约工作汇报PPT模版&#xff0c;莫兰迪时尚风极简设计PPT模版&#xff0c;大学生毕业论文答辩PPT模版&#xff0c;莫兰迪配色总结计划简约商务通用PPT模版&#xff0c;莫兰迪商务汇报PPT模版&#xff0c;…...

08. C#入门系列【类的基本概念】:开启编程世界的奇妙冒险

C#入门系列【类的基本概念】&#xff1a;开启编程世界的奇妙冒险 嘿&#xff0c;各位编程小白探险家&#xff01;欢迎来到 C# 的奇幻大陆&#xff01;今天咱们要深入探索这片大陆上至关重要的 “建筑”—— 类&#xff01;别害怕&#xff0c;跟着我&#xff0c;保准让你轻松搞…...

【JVM】Java虚拟机(二)——垃圾回收

目录 一、如何判断对象可以回收 &#xff08;一&#xff09;引用计数法 &#xff08;二&#xff09;可达性分析算法 二、垃圾回收算法 &#xff08;一&#xff09;标记清除 &#xff08;二&#xff09;标记整理 &#xff08;三&#xff09;复制 &#xff08;四&#xff…...

【C++】纯虚函数类外可以写实现吗?

1. 答案 先说答案&#xff0c;可以。 2.代码测试 .h头文件 #include <iostream> #include <string>// 抽象基类 class AbstractBase { public:AbstractBase() default;virtual ~AbstractBase() default; // 默认析构函数public:virtual int PureVirtualFunct…...

Linux中《基础IO》详细介绍

目录 理解"文件"狭义理解广义理解文件操作的归类认知系统角度文件类别 回顾C文件接口打开文件写文件读文件稍作修改&#xff0c;实现简单cat命令 输出信息到显示器&#xff0c;你有哪些方法stdin & stdout & stderr打开文件的方式 系统⽂件I/O⼀种传递标志位…...

react菜单,动态绑定点击事件,菜单分离出去单独的js文件,Ant框架

1、菜单文件treeTop.js // 顶部菜单 import { AppstoreOutlined, SettingOutlined } from ant-design/icons; // 定义菜单项数据 const treeTop [{label: Docker管理,key: 1,icon: <AppstoreOutlined />,url:"/docker/index"},{label: 权限管理,key: 2,icon:…...