多线程的概念
多线程
同时执行多个任务,例如一个人一边听歌,一边跳舞
继承Thread类实现多线程的方式
定义一个MyThread类继承Thread类,重写里面的run方法
package com.itxs.demo01;/*** @Classname : MyThread* @Description : TODO 自定义线程继承Thread类* @Author : lin_refuel@qq.com*/
public class MyThread extends Thread{@Overridepublic void run() {//super.run();for (int i = 0; i < 20; i++) {System.out.println("i = " + i);}}
}
测试多线程类
package com.itxs.demo01;/*** @Classname : demo01* @Description : TODO 多线程的测试类* @Author : lin_refuel@qq.com*/
public class demo01 {public static void main(String[] args) {// 线程对象创建MyThread my01 = new MyThread();MyThread my02 = new MyThread();MyThread my03 = new MyThread();MyThread my04 = new MyThread();//开启线程的方法startmy01.start();my02.start();my03.start();my04.start();}
}
线程名字的获取和设置
自定义线程继承Thread类
package com.itxs.demo02;/*** @Classname : MyThread* @Description : TODO 自定义线程 - 继承Thread类* @Author : lin_refuel@qq.com*/
public class MyThread extends Thread {public MyThread() {}public MyThread(String name) {super(name);}@Overridepublic void run() {for (int i = 0; i < 20; i++) {// this.getName获取类中自己的Name值System.out.println(this.getName() + " i =" + i);}}
}
测试线程
package com.itxs.demo02;/*** @Classname : demo01* @Description : TODO 多线程名字设置的方式* @Author : lin_refuel@qq.com*/
public class demo01 {public static void main(String[] args) {//创建线程对象// 方式一:通过构造方法进行设置每个线程名字MyThread my01 = new MyThread("线程01");MyThread my02 = new MyThread("线程02");MyThread my03 = new MyThread("线程03");MyThread my04 = new MyThread();// 方式二:通过方法setName设置线程名字
// my01.setName("线程01");
// my02.setName("线程02");
// my03.setName("线程03");my04.setName("线程04");//开启线程my01.start();my02.start();my03.start();my04.start();}
}
运行结果:

获取正在运行的线程对象
获取正在运行的线程
Thread.currentThread()
通过上面的方法,获取到每个运行线程的名字
package com.itxs.demo02;/*** @Classname : MyThread* @Description : TODO 自定义线程(输出0-19) - 继承Thread类* @Author : lin_refuel@qq.com*/
public class MyThread extends Thread {public MyThread() {}public MyThread(String name) {super(name);}@Overridepublic void run() {for (int i = 0; i < 20; i++) {// this.getName获取类中自己的Name值System.out.println(Thread.currentThread().getName() + " i =" + i);}}
}
package com.itxs.demo02;/*** @Classname : demo03* @Description : TODO 获取每个正在运行的线程的方法* @Author : lin_refuel@qq.com*/
public class demo03 {public static void main(String[] args) {// 创建几个线程对象,设置每个线程的名字MyThread my01 = new MyThread("多线程01");MyThread my02 = new MyThread("多线程02");MyThread my03 = new MyThread("多线程03");MyThread my04 = new MyThread("多线程04");//开启线程my01.start();my02.start();my03.start();my04.start();// main 其实也是一个线程,但是却是主线程// 输出0-19//设置主线程名字的方法 Thread.currentThread是获取正在运行的线程//setName是设置名字Thread.currentThread().setName("主线程");for (int i = 0; i < 20; i++) {System.out.println( Thread.currentThread().getName()+"i = " + i);}}
}
线程调度
-
两种线程调度模型
-
分时调度模型:所有线程轮流使用 CPU 的使用权,平均分配每个线程占用 CPU 的时间
-
抢占调度模型:优先让优先级高的线程使用 CPU,如果线程的欧优先级相同,那么随机选择一个,优先级高的线程获取的 CPU 占用时间会相对多一丢丢丢丢丢……
Java 使用的是抢占式的调度模型
-
线程优先级设置
-
Thread 类中设置和获取线程优先级的方法
-
public final int getPriority():返回次线程的优先级 -
public final void setProiority(int newPriority):更改次线程的优先级
-
自定义的线程类-继承Thread类
package com.itxs.demo02;/*** @Classname : MyThread* @Description : TODO 自定义线程(输出0-19) - 继承Thread类* @Author : lin_refuel@qq.com*/
public class MyThread extends Thread {public MyThread() {}public MyThread(String name) {super(name);}@Overridepublic void run() {for (int i = 0; i < 20; i++) {// this.getName获取类中自己的Name值System.out.println(Thread.currentThread().getName() + " i =" + i);}}
}
优先级测试
package com.itxs.demo02;/*** @Classname : demo02* @Description : TODO 线程调度测试* @Author : lin_refuel@qq.com*/
public class demo02 {public static void main(String[] args) {// 创建线程对象MyThread mt01 = new MyThread("线程01");MyThread mt02 = new MyThread("线程02");MyThread mt03 = new MyThread("线程03");//修改线程的优先级mt01.setPriority(Thread.MIN_PRIORITY);//1mt02.setPriority(Thread.NORM_PRIORITY);//5mt03.setPriority(Thread.MAX_PRIORITY);//10// 线程的优先级输出
// System.out.println(mt01.getPriority());
// System.out.println(mt02.getPriority());
// System.out.println(mt03.getPriority());//开启线程测试那个线程优先完成mt03.start();mt02.start();mt01.start();}
}
线程控制
| 方法名 | 说明 |
|---|---|
static void sleep(long ms) | 使当前正在执行的线程停留指定的毫秒数 |
void join() | 等待这个进程死亡 |
void setDaemon(boolean on) | 将此线程标记为守护进程,当运行线程都是守护线程时,JVM 将退出 |
sleep方法
案例:华山论剑
自定义线程类
package com.itxs.demo02;/*** @Classname : MyThread* @Description : TODO 自定义一个线程 - 继承Thread类* @Author : lin_refuel@qq.com*/
public class MyThread extends Thread{public MyThread() {}public MyThread(String name) {super(name);}@Overridepublic void run() {for (int i = 1; i <=20 ; i++) {System.out.println(Thread.currentThread().getName() + "出了第"+i+"招");try {Thread.sleep(1000);//停留一秒} catch (InterruptedException e) {e.printStackTrace();}}}
}
sleep测试类
package com.itxs.demo02;/*** @Classname : demo02* @Description : TODO 线程测试 - sleep* @Author : lin_refuel@qq.com*/
public class demo02 {public static void main(String[] args) {//创建线程对象MyThread mt01 = new MyThread("黄固");MyThread mt02 = new MyThread("欧阳锋");MyThread mt03 = new MyThread("段智兴");MyThread mt04 = new MyThread("洪七公");//开启线程mt01.start();mt02.start();mt03.start();mt04.start();}
}
join方法
歌曲《天下》,原唱:张杰,翻唱:池瑶和高鱼
package com.itxs.demo03;/*** @Classname : MyThread* @Description : TODO* @Author : lin_refuel@qq.com*/
public class MyThread extends Thread {public MyThread() {super();}public MyThread(String name) {super(name);}// 定义一个数组存放歌词String[] song = {"烽烟起寻爱似浪淘沙","遇见她如春水映梨花","挥剑断天涯","相思轻放下"};@Overridepublic void run() {for (int i = 0; i < song.length; i++) {System.out.println(Thread.currentThread().getName() + "正在唱:" + song[i]);}}
}
测试-张杰唱完后,两个翻唱继续唱
package com.itxs.demo03;/*** @Classname : demo01* @Description : TODO* @Author : lin_refuel@qq.com*/
public class demo01 {public static void main(String[] args) throws InterruptedException {//创建线程MyThread mt01 = new MyThread("张杰");MyThread mt02 = new MyThread("池瑶");MyThread mt03 = new MyThread("高鱼");//开启线程mt01.start();mt01.join();//等待张杰唱完,mt01执行完后执行后面的线程mt02.start();mt03.start();}
}
setDaemon()
守护线程,总结就是当创建的线程对象设置为守护线程后,主线程里面的内容执行完后,所有开启的多线程都会停止执行
自定义的线程,执行20次循环
package com.itxs.demo04;/*** @Classname : MyThread* @Description : TODO - 自定义线程* @Author : lin_refuel@qq.com*/
public class MyThread extends Thread{public MyThread() {super();}public MyThread(String name) {super(name);}@Overridepublic void run() {for (int i = 0; i < 20; i++) {System.out.println(Thread.currentThread().getName()+"报数:"+i);}}
}
测试守护线程
package com.itxs.demo04;/*** @Classname : demo01* @Description : TODO* @Author : lin_refuel@qq.com*/
public class demo01 {public static void main(String[] args) {//创建线程对象MyThread mt01 = new MyThread("1号");MyThread mt02 = new MyThread("2号");MyThread mt03 = new MyThread("3号");System.out.println("开始报数");//mt01,02,03设置为守护线程mt01.setDaemon(true);mt02.setDaemon(true);mt03.setDaemon(true);// 线程开启mt01.start();mt02.start();mt03.start();// 主线程执行三次循环for (int i = 0; i < 3; i++) {System.out.println("报数中");}System.out.println("停止报数");}
}

线程的生命周期
-
新建:创建线程对象(通过
start()进入下一个环节) -
就绪:有执行资格,没有执行权(抢占 CPU 的执行权)
-
运行:有执行资格,有执行权(可能被其他线程抢走 CPU 的执行权,则回到就绪状态,若遇到阻塞式方法,则失去运行权和执行这个,等待,当阻塞方法调用结束之后,回到就绪状态)
-
死亡:线程死亡,成为垃圾
相关文章:
多线程的概念
多线程 同时执行多个任务,例如一个人一边听歌,一边跳舞 继承Thread类实现多线程的方式 定义一个MyThread类继承Thread类,重写里面的run方法 package com.itxs.demo01;/*** Classname : MyThread* Description : TODO 自定义线程继承Thread类*…...
DeepPurpose 生物化学深度学习库;蛋白靶点小分子药物对接亲和力预测虚拟筛选
参考: https://blog.csdn.net/c9Yv2cf9I06K2A9E/article/details/107649770 https://github.com/kexinhuang12345/DeepPurpose ##安装 pip install DeepPurpose rdkitDeepPurpose包括: 数据: 关联TDC库下载,是同一作者开发的 https://blog.csdn.net/weixin_42357472/artic…...
Java实现责任链模式
责任链模式是一种设计模式,用于处理请求的解耦。在责任链模式中,多个对象都有机会处理请求,从而避免了请求发送者和接收者之间的直接依赖关系。每个处理者都可以决定是否处理请求以及将请求传递给下一个处理者。 简介 责任链模式由一条链组…...
rabbitmq延时队列相关配置
确保 RabbitMQ 的延时消息插件已经安装和启用。你可以通过执行以下命令来安装该插件: rabbitmq-plugins enable rabbitmq_delayed_message_exchange 如果提示未安装,以下是安装流程: 查看mq版本: 查看自己使用的 MQ(…...
【工具】推荐一个好用的代码画图工具
PlantUML 官网地址:https://plantuml.com/zh/ 跳转 支持各种结构化数据画图支持代码调用jar包生成图片 提供在线画图能力 https://www.plantuml.com/plantuml/uml/SyfFKj2rKt3CoKnELR1Io4ZDoSa70000 有兴趣可以尝试下 over~~...
Leetcode14-判断句子是否为全字母句(1832)
1、题目 全字母句 指包含英语字母表中每个字母至少一次的句子。 给你一个仅由小写英文字母组成的字符串 sentence ,请你判断 sentence 是否为 全字母句 。 如果是,返回 true ;否则,返回 false 。 示例 1: 输入&am…...
HTTP和TCP代理原理及实现,主要是理解
Web 代理是一种存在于网络中间的实体,提供各式各样的功能。现代网络系统中,Web 代理无处不在。我之前有关 HTTP 的博文中,多次提到了代理对 HTTP 请求及响应的影响。今天这篇文章,我打算谈谈 HTTP 代理本身的一些原理,…...
MySQL中的连接池
数据库的连接池 1 )概述 网站连接数据库,为庞大用户的每次请求创建一个连接是不合适的关闭并重新连接的成本是很大的处理方法:设置最大值, 最小值, 设置最多闲置连接,设置等待阻塞 2 )示例演示 import threading i…...
css计时器 animation实现计时器延时器
css计时器 animation实现计时器延时器 缺点当切页面导航会休眠不执行 最初需求是一个列表每个项目都有各自的失效时间 然后就想到 计时器延时器轮询等方案 这些方案每一个都要有自己的计时器 感觉不是很好 轮询也占资源 然后突发奇想 css能不能实现 开始想到的是transition测…...
【win11 绕过TPM CPU硬件限制安装】
Qt编程指南 VX:hao541022348 ■ 下载iso文件■ 右键文件点击装载出现如下问题■ 绕过TPM CPU硬件限制安装方法■ 虚拟机安装win11 ■ 下载iso文件 选择Windows11 (multi-edition ISO)在选择中文 ■ 右键文件点击装载出现如下问题 ■ 绕过T…...
k8s的yaml文件中的kind类型都有哪些?(清单版本)
在操作kubernetes的过程中,我们接触到的yaml文件中的kind类型有很多。他们代表了kubernetes的不同类型的对象,了解了kind的类型,也就相当于了解了k8s都有哪些类型的对象。 类型清单及概要说明 序号类型简述1Pod一个Kubernetes中最基本的资源…...
Jetpack Room使用
Room使用 回顾 数据库有多张表,一张表只能记录一种Class,Class的具体属性是这个表的列;所有对表的操作都要通过Dao来访问 注解说明: Enity 作用于Class上,表示创建一张表记录该Class,Class内部属性使用…...
HarmonyOS应用开发之ArkTS语言学习记录
1、ArkTS介绍 ArkTS是鸿蒙生态的应用开发语言。它在保持TypeScript(简称TS)基本语法风格的基础上,对TS的动态类型特性施加更严格的约束,引入静态类型。同时,提供了声明式UI、状态管理等相应的能力,让开发者…...
windows 下 mongodb6.0 导入导出json文件
1.运行cmd窗口,进入MongoDB安装路径下的bin文件下,输入以下命令导入数据文件 mongoimport --host 127.0.0.1 --port 27017 --db <数据库名称,根据自个情况> -c <集合名称,自定义> --file <导入文件的路径名> …...
如何给 unplugin-vue-components/vite 写一个简单的 resolver
大部分工作 unplugin-vue-components 都已经处理好了, 我们只需要接收组件名来判断是否是自己的组件, 然后处理对应的导入逻辑。 一共 3 个字段 as 重命名类似 import { componentNameReName } from ‘xxxx’name 组件名 import { componentName } from ‘xxxx’from 导入路径…...
MYSQL篇--索引高频面试题
mysql索引 1什么是索引? 索引说白了就是一种数据结构,可以协助快速查询数据,以及更新数据库表中的数据,更通俗的来说索引其实就是目录,通过对数据建立索引形成目录,便于去查询数据,而mysql索引…...
视频号小店怎么上架商品?实操分享,干货满满!
我是电商珠珠 视频号小店从22年7月到现在也不过才发展了一年,它的风口才刚刚开始。 平台为了吸引商家入驻,会将大量红利向商家倾斜,只要把握住风口,就会很快起飞。 视频号小店对于很多人来说,都是新平台,…...
Python 常用数据类型
Python 常用数据类型有以下这些: 数据类型中文解析例子int整数,表示整数值1、2float浮点数,表示带有小数点的数值3.14、2.718complex复数,表示实部和虚部组成的复数12j、3-4jstr字符串,表示文本数据,用引号…...
基于yolov2深度学习网络的车辆行人检测算法matlab仿真
目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 MATLAB2022a 3.部分核心程序 .......................................................... load yolov2.mat% 加载训练好的…...
【QT】中英文切换
很高兴在雪易的CSDN遇见你 前言 本文分享QT中如何进行中英文切换,希望对各位小伙伴有所帮助! 感谢各位小伙伴的点赞关注,小易会继续努力分享,一起进步! 你的点赞就是我的动力(^U^…...
在rocky linux 9.5上在线安装 docker
前面是指南,后面是日志 sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo dnf install docker-ce docker-ce-cli containerd.io -y docker version sudo systemctl start docker sudo systemctl status docker …...
STM32F4基本定时器使用和原理详解
STM32F4基本定时器使用和原理详解 前言如何确定定时器挂载在哪条时钟线上配置及使用方法参数配置PrescalerCounter ModeCounter Periodauto-reload preloadTrigger Event Selection 中断配置生成的代码及使用方法初始化代码基本定时器触发DCA或者ADC的代码讲解中断代码定时启动…...
MMaDA: Multimodal Large Diffusion Language Models
CODE : https://github.com/Gen-Verse/MMaDA Abstract 我们介绍了一种新型的多模态扩散基础模型MMaDA,它被设计用于在文本推理、多模态理解和文本到图像生成等不同领域实现卓越的性能。该方法的特点是三个关键创新:(i) MMaDA采用统一的扩散架构…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院查看报告小程序
一、开发环境准备 工具安装: 下载安装DevEco Studio 4.0(支持HarmonyOS 5)配置HarmonyOS SDK 5.0确保Node.js版本≥14 项目初始化: ohpm init harmony/hospital-report-app 二、核心功能模块实现 1. 报告列表…...
深入解析C++中的extern关键字:跨文件共享变量与函数的终极指南
🚀 C extern 关键字深度解析:跨文件编程的终极指南 📅 更新时间:2025年6月5日 🏷️ 标签:C | extern关键字 | 多文件编程 | 链接与声明 | 现代C 文章目录 前言🔥一、extern 是什么?&…...
比较数据迁移后MySQL数据库和OceanBase数据仓库中的表
设计一个MySQL数据库和OceanBase数据仓库的表数据比较的详细程序流程,两张表是相同的结构,都有整型主键id字段,需要每次从数据库分批取得2000条数据,用于比较,比较操作的同时可以再取2000条数据,等上一次比较完成之后,开始比较,直到比较完所有的数据。比较操作需要比较…...
uniapp 小程序 学习(一)
利用Hbuilder 创建项目 运行到内置浏览器看效果 下载微信小程序 安装到Hbuilder 下载地址 :开发者工具默认安装 设置服务端口号 在Hbuilder中设置微信小程序 配置 找到运行设置,将微信开发者工具放入到Hbuilder中, 打开后出现 如下 bug 解…...
海云安高敏捷信创白盒SCAP入选《中国网络安全细分领域产品名录》
近日,嘶吼安全产业研究院发布《中国网络安全细分领域产品名录》,海云安高敏捷信创白盒(SCAP)成功入选软件供应链安全领域产品名录。 在数字化转型加速的今天,网络安全已成为企业生存与发展的核心基石,为了解…...
2025.6.9总结(利与弊)
凡事都有两面性。在大厂上班也不例外。今天找开发定位问题,从一个接口人不断溯源到另一个 接口人。有时候,不知道是谁的责任填。将工作内容分的很细,每个人负责其中的一小块。我清楚的意识到,自己就是个可以随时替换的螺丝钉&…...
李沐--动手学深度学习--GRU
1.GRU从零开始实现 #9.1.2GRU从零开始实现 import torch from torch import nn from d2l import torch as d2l#首先读取 8.5节中使用的时间机器数据集 batch_size,num_steps 32,35 train_iter,vocab d2l.load_data_time_machine(batch_size,num_steps) #初始化模型参数 def …...
