当前位置: 首页 > 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 创建…...

NVIDIA突破:单显卡实现图片驱动720p长视频世界模型生成能力提升

这项由NVIDIA研究团队主导的研究成果于2026年5月以预印本形式发布&#xff0c;论文编号为arXiv:2605.15178&#xff0c;感兴趣的读者可通过该编号查阅完整原文。给你一张照片&#xff0c;再给你一条摄像机的移动路线&#xff0c;然后电脑自动生成一段完整的一分钟高清视频&…...

2026别错过!一键生成论文工具深度测评与推荐

2026年真正好用的一键生成论文工具&#xff0c;核心看生成的论文质量、低AI味、格式正确、学术适配四大指标。综合实测&#xff0c;千笔AI、ThouPen、豆包、DeepSeek、Grammarly 是当前最值得推荐的梯队&#xff0c;覆盖从免费到付费、从中文到英文、从文科到理工的全场景需求。…...

告别PPT超时焦虑:PPTTimer让演讲时间管理变得如此简单

告别PPT超时焦虑&#xff1a;PPTTimer让演讲时间管理变得如此简单 【免费下载链接】ppttimer 一个简易的 PPT 计时器 项目地址: https://gitcode.com/gh_mirrors/pp/ppttimer 还在为PPT演示超时而烦恼吗&#xff1f;每次演讲都像和时间赛跑&#xff0c;担心讲得太快或太…...

Potree加载点云实战:从CloudCompare检查到浏览器3D展示的全链路避坑

Potree点云加载全流程实战&#xff1a;从数据验收到3D可视化的深度指南 点云数据正逐渐成为三维地理信息系统、建筑信息模型和数字孪生领域的核心载体。作为开源点云可视化库的佼佼者&#xff0c;Potree以其高效的Web端渲染能力赢得了众多开发者的青睐。然而在实际项目集成过程…...

三步掌握免费文档下载神器:kill-doc浏览器脚本完全指南

三步掌握免费文档下载神器&#xff1a;kill-doc浏览器脚本完全指南 【免费下载链接】kill-doc 看到经常有小伙伴们需要下载一些免费文档&#xff0c;但是相关网站浏览体验不好各种广告&#xff0c;各种登录验证&#xff0c;需要很多步骤才能下载文档&#xff0c;该脚本就是为了…...

洛雪音乐六音音源修复完整指南:快速恢复音乐播放功能

洛雪音乐六音音源修复完整指南&#xff1a;快速恢复音乐播放功能 【免费下载链接】New_lxmusic_source 六音音源修复版 项目地址: https://gitcode.com/gh_mirrors/ne/New_lxmusic_source 洛雪音乐是一款广受欢迎的开源音乐播放器&#xff0c;但近期许多用户遇到了六音音…...

为什么顶级AI艺术家总在第3轮生成才出片?——揭秘构图迭代中的“临界收敛点”与3次生成内锁定最佳构图的硬核策略

更多请点击&#xff1a; https://kaifayun.com 第一章&#xff1a;为什么顶级AI艺术家总在第3轮生成才出片&#xff1f; AI图像生成并非“一击必中”的魔法&#xff0c;而是一场精密的概率博弈。Stable Diffusion、DALLE 3 和 MidJourney v6 等主流模型在采样过程中采用多步去…...

IDM激活脚本:破解30天限制背后的注册表权限技术内幕

IDM激活脚本&#xff1a;破解30天限制背后的注册表权限技术内幕 【免费下载链接】IDM-Activation-Script IDM Activation & Trail Reset Script 项目地址: https://gitcode.com/gh_mirrors/id/IDM-Activation-Script 你是否曾经因为IDM的30天试用期到期而烦恼&#…...

ops-rand:AI 训练中的随机数生成

AI 训练离不开随机数。权重初始化要随机、Dropout 要随机、数据打乱要随机、噪声注入要随机。每一次随机操作的背后&#xff0c;都有一组随机数生成器在工作。 CANN 的 ops-rand 仓库提供了 NPU 上的随机数生成算子——Dropout、随机 Shuffle、随机初始化、正态分布采样等。这…...

戴尔G15散热终极控制:开源TCC-G15高效替代方案完全指南

戴尔G15散热终极控制&#xff1a;开源TCC-G15高效替代方案完全指南 【免费下载链接】tcc-g15 Thermal Control Center for Dell G15 - open source alternative to AWCC 项目地址: https://gitcode.com/gh_mirrors/tc/tcc-g15 对于戴尔G15笔记本用户而言&#xff0c;过热…...