多线程的概念
多线程
同时执行多个任务,例如一个人一边听歌,一边跳舞
继承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^…...

IDEA运行Tomcat出现乱码问题解决汇总
最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…...

TDengine 快速体验(Docker 镜像方式)
简介 TDengine 可以通过安装包、Docker 镜像 及云服务快速体验 TDengine 的功能,本节首先介绍如何通过 Docker 快速体验 TDengine,然后介绍如何在 Docker 环境下体验 TDengine 的写入和查询功能。如果你不熟悉 Docker,请使用 安装包的方式快…...

React第五十七节 Router中RouterProvider使用详解及注意事项
前言 在 React Router v6.4 中,RouterProvider 是一个核心组件,用于提供基于数据路由(data routers)的新型路由方案。 它替代了传统的 <BrowserRouter>,支持更强大的数据加载和操作功能(如 loader 和…...
Admin.Net中的消息通信SignalR解释
定义集线器接口 IOnlineUserHub public interface IOnlineUserHub {/// 在线用户列表Task OnlineUserList(OnlineUserList context);/// 强制下线Task ForceOffline(object context);/// 发布站内消息Task PublicNotice(SysNotice context);/// 接收消息Task ReceiveMessage(…...

Debian系统简介
目录 Debian系统介绍 Debian版本介绍 Debian软件源介绍 软件包管理工具dpkg dpkg核心指令详解 安装软件包 卸载软件包 查询软件包状态 验证软件包完整性 手动处理依赖关系 dpkg vs apt Debian系统介绍 Debian 和 Ubuntu 都是基于 Debian内核 的 Linux 发行版ÿ…...

蓝牙 BLE 扫描面试题大全(2):进阶面试题与实战演练
前文覆盖了 BLE 扫描的基础概念与经典问题蓝牙 BLE 扫描面试题大全(1):从基础到实战的深度解析-CSDN博客,但实际面试中,企业更关注候选人对复杂场景的应对能力(如多设备并发扫描、低功耗与高发现率的平衡)和前沿技术的…...

(二)原型模式
原型的功能是将一个已经存在的对象作为源目标,其余对象都是通过这个源目标创建。发挥复制的作用就是原型模式的核心思想。 一、源型模式的定义 原型模式是指第二次创建对象可以通过复制已经存在的原型对象来实现,忽略对象创建过程中的其它细节。 📌 核心特点: 避免重复初…...

2021-03-15 iview一些问题
1.iview 在使用tree组件时,发现没有set类的方法,只有get,那么要改变tree值,只能遍历treeData,递归修改treeData的checked,发现无法更改,原因在于check模式下,子元素的勾选状态跟父节…...

html css js网页制作成品——HTML+CSS榴莲商城网页设计(4页)附源码
目录 一、👨🎓网站题目 二、✍️网站描述 三、📚网站介绍 四、🌐网站效果 五、🪓 代码实现 🧱HTML 六、🥇 如何让学习不再盲目 七、🎁更多干货 一、👨…...

[大语言模型]在个人电脑上部署ollama 并进行管理,最后配置AI程序开发助手.
ollama官网: 下载 https://ollama.com/ 安装 查看可以使用的模型 https://ollama.com/search 例如 https://ollama.com/library/deepseek-r1/tags # deepseek-r1:7bollama pull deepseek-r1:7b改token数量为409622 16384 ollama命令说明 ollama serve #:…...