Java多线程(三)
目录
一、Thread类基本用法
1.1 Thread常见构造方法
1.2 Thread常见属性
二、多线程常用的创建方式
2.1 继承Thread类
2.2 实现Runnable接口
2.3 继承Thread接口,使用匿名内部类
2.4实现Runnable接口,使用匿名内部类
2.5使用lambda表达式
三、线程的启动
3.1 start()方法和run()方法的区别
四、线程终止
4.1通过共享标记来终止
4.2通过调用interrupt()方法来终止
五、多线程等待
六、多线程休眠
七、获取多线程实例对象
一、Thread类基本用法
1.1 Thread常见构造方法
| 方法 | 说明 |
| Thread() | 创建线程对象 |
| Thread(Runnable target) | 使用 Runnable 对象创建线程对象 |
| Thread(String name) | 创建线程对象,并命名 |
| Thread(Runnable target, String name) | 使用 Runnable 对象创建线程对象,并命名 |
| Thread(ThreadGroup group, Runnable target) | 线程可以被用来分组管理,分好的组即为线程组,了解即可 |
1.2 Thread常见属性
| 属性 | 获取方法 |
| ID | getId() |
| 名称 | getName() |
| 状态 | getState() |
| 优先级 | getPriority() |
| 是否后台线程 | isDaemon(),后台线程不影响进程的结束 |
| 是否存活 | isAlive() |
| 是否被中断 | isInterrupted() |
二、多线程常用的创建方式
2.1 继承Thread类
class MyThread extends Thread {//重写run方法@Overridepublic void run() {}
}public class test{public static void main(String[] args){MyThread t = new MyThread();t.start();}
}
2.2 实现Runnable接口
class MyRunnable implements Runnable{//重写run方法@Overridepublic void run(){}
}public class test{public static void main(Strings[] args){MyRunnable runnable = new MyRunnable();//这个对象需要放在Thread中才能创建线程Thread t = new Thread(runnable);t.start();}
}
2.3 继承Thread接口,使用匿名内部类
public class test {public static void main(Strings[] args){Thread t = new Thread(){//重写run方法@Overridepublic void run(){}};t.start();}
}
2.4实现Runnable接口,使用匿名内部类
public class test{public static void main(Strings[] args){Thread t = new Thread(new Runnable{//重写run方法@Overridepublic void run(){} });t.start();}
}
2.5使用lambda表达式
public class test{public static void main(String[] args){Thread t = new Thread(()->{//直接写具体的内容 },name);//可以自定义多线程的名字t.start();}
}
三、线程的启动
3.1 start()方法和run()方法的区别
- start方法会调用api接口创建线程
- run方法只是Thread类中的一个方法,不会创建出线程
- start方法执行的过程中会并发执行其他任务
- run方法不能并发执行其他任务,只能等run方法中的任务执行完才能执行下一个任务
四、线程终止
4.1通过共享标记来终止
这里会涉及到一个lambda表达式的变量捕获,当作为局部变量的时候最好是不可变的,作为成员变量的时候要是静态的。
public class Demo6 {//设置标记位public static boolean flag = false;public static void main(String[] args) throws InterruptedException {Thread t = new Thread(()->{while (!flag) {System.out.println("hello Thread");try {Thread.sleep(1000);} catch (InterruptedException e) {throw new RuntimeException(e);}}});t.start();Thread.sleep(1000);flag = true;//通过将标志位转换达到停止程序的目的System.out.println("程序终止");}
}
4.2通过调用interrupt()方法来终止
调用interrupt()方法终止程序的时候,在唤醒程序后会将标志位进行清除,这里就会留有很大的操作空间供自己操作。包括是否立即终止、执行其他操作、继续执行当前代码。
| 方法 | 说明 |
| public void interrupt() | 中断对象关联的线程,如果线程正在阻塞,则以异常方式通知, 否则设置标志位 |
| public static boolean interrupted() | 判断当前线程的中断标志位是否设置,调用后清除标志位 |
| public boolean isInterrupted() | 判断对象关联的线程的标志位是否设置,调用后不清除标志位 |
public class Demo7 {public static void main(String[] args) throws InterruptedException {Thread t = new Thread(()->{、//利用isInterrupted来设置标记while (!Thread.currentThread().isInterrupted()) {System.out.println("hello Thread");try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();break;}}});t.start();Thread.sleep(3000);t.interrupt();//将标记转换进而终止程序System.out.println("程序终止");}
}
五、多线程等待
多线程的执行是随机的,但是一般程序的编写我们都是希望有顺序的执行和结束,所以这里采用join()方法对线程进行等待。当一个线程加入join()方法时,就要阻塞等待调用该方法的线程执行完才能执行结束当前线程。
| 方法 | 说明 |
| public void join() | 等待线程结束 |
| public void join(long millis) | 等待线程结束,最多等 millis 毫秒 |
| public void join(long millis, int nanos) | 同理,但可以更高精度 |
public class Demo8 {public static void main(String[] args) {Thread t1 = new Thread(()->{for (int i = 0; i < 3; i++) {System.out.println("t1正在执行");try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}}System.out.println("t1结束");});Thread t2 = new Thread(()->{for (int i = 0; i < 3; i++) {System.out.println("t2正在执行");try {Thread.sleep(1000);t1.join();//需要等待t1执行完毕} catch (InterruptedException e) {e.printStackTrace();}}System.out.println("t2结束");});t1.start();t2.start();}
}
六、多线程休眠
也是我们比较熟悉一组方法,有一点要记得,因为线程的调度是不可控的,所以,这个方法只能保证实际休眠时间是大于等于参数设置的休眠时间的
| 方法 | 说明 |
| public static void sleep(long millis) throws InterruptedException | 休眠当前线程 millis 毫秒 |
| public static void sleep(long millis, int nanos) throws InterruptedException | 可以更高精度的休眠 |
public class ThreadDemo {public static void main(String[] args) throws InterruptedException {System.out.println("开始");Thread.sleep(1000);//线程进行休眠1sSystem.out.println("结束");}
}
七、获取多线程实例对象
| 方法 | 说明 |
| public static Thread currentThread(); | 返回当前线程对象的引用 |
public class ThreadDemo {public static void main(String[] args) {Thread thread = Thread.currentThread();System.out.println(thread.getName());}
}相关文章:
Java多线程(三)
目录 一、Thread类基本用法 1.1 Thread常见构造方法 1.2 Thread常见属性 二、多线程常用的创建方式 2.1 继承Thread类 2.2 实现Runnable接口 2.3 继承Thread接口,使用匿名内部类 2.4实现Runnable接口,使用匿名内部类 2.5使用lambda表达式 三、线程的启动…...
Linux操作系统3-项目部署
手动部署 步骤 1.在idea中将文件项目进行打包 2.自定义一个文件目录,上传到Linux 3.使用 java -jar jar包名就可以进行运行 注意,如果需要启动该项目,需要确定所需的端口是否打开 采用这种方式,程序运行的时候会出现霸屏,并且会…...
软件测试面试题——接口自动化测试怎么做?
面试过程中,也问了该问题,以下是自己的回答: 接口自动化测试,之前做过,第一个版本是用jmeter 做的,1 主要是将P0级别的功能接口梳理出来,根据业务流抓包获取相关接口,并在jmeter中跑…...
如何在医疗器械行业运用IPD?
医疗器械是指单独或者组合使用于人体的仪器、设备、器具、材料或其他物品,包括所需要的软件。按安全性可分为低风险器械、中风险器械和高风险器械。其中低风险器械大都属于低值耗材,其中包括绷带、纱布、海绵、消毒液等;中度风险器械类包括体…...
16. Spring Boot 统一功能处理
目录 1. 用户登录权限校验 1.1 最初用户登录验证 1.2 Spring AOP 用户统一登陆验证 1.3 Spring 拦截器 1.3.1 创建自定义拦截器 1.3.2 将自定义拦截器加入系统配置 1.4 练习:登录拦截器 1.5 拦截器实现原理 1.6 统一访问前缀添加 2. 统一异常处理 3. 统…...
PostgreSQL-数据库命令
PostgreSQL-数据库命令 介绍 一个数据库是一个或多个模式的集合,而模式包含表、函数等。因此,完整的逻辑组织结构层次是服务器实例(PostgreSQL Server)、数据库(Database)、模式(Schema)、表(Table),以及某些其他对象(如函数)。一个PostgreSQL服务器实例可以管理…...
面试题:说说JavaScript中内存泄漏的几种情况?垃圾回收机制
内存泄漏 一、是什么?二、垃圾回收机制?2.1、标记清除法2.2、引用计数法 三、常见内存泄露情况 一、是什么? 由于疏忽或错误造成程序未能释放已经不再使用的内存;并非指内存在物理上的消失,而是应用程序分配某段内存后…...
HTML基础介绍1
HTML是什么 1.HTML(HyperText Mark-up Language)即超文本标签语言(可以展示的内容类型很多) 2.HTML文本是由HTML标签组成的文本,可以包括文字、图形、动画、声音、表格、连接等 3.HTML的结构包括头部(He…...
【腾讯云 Cloud Studio 实战训练营】Redisgo_task 分布式锁实现
文章目录 前言问题场景腾讯云 Cloud Studio Redisgo_task长短类型分布式场景介绍Redisgo_task实现原理SetNx(valueexpire)原子性子协程Done()时间点子协程中的Ticker Redisgo_task唯一外部依赖Redisgo_task Lock结构Redisgo_task架构健壮性设计Redisgo_task可扩展性Redisgo_tas…...
Linux CentOS系统怎么下载软件
Linux CenOS系统想要下载软件可以在Linux内置的应用商店,并通过Yum 包管理器来下载(直接使用yum命令下载软件) 在Linux系统中,Yum(Yellowdog Updater, Modified)是用于管理RPM软件包的一个包管理器。 安装…...
SNAT和DNAT原理与应用
iptables的备份和还原 1.写在命令行当中的都是临时配置。 2.把我们的规则配置在 备份(导出):iptables-save > /opt/iptables.bak 默认配置文件:/etc/sysconfig/iptables 永久配置:cat /opt/iptables.bak > /etc…...
Java8实战-总结11
Java8实战-总结11 Lambda表达式方法引用管中窥豹如何构建方法引用 构造函数引用 Lambda表达式 方法引用 方法引用让你可以重复使用现有的方法定义,并像Lambda一样传递它们。在一些情况下,比起使用Lambda表达式,它们似乎更易读,感…...
2023爱分析·低代码厂商全景报告|爱分析报告
关键发现 低代码开始向甲方核心场景渗透,呈现两个显著特征:“更深入”、“更垂直”。更深入,即甲方愈发注重低代码在复杂业务场景的应用开发能力;更垂直,即甲方需要使用低代码开发行业垂直应用,因此对行业或…...
视频两侧有黑边怎么处理?教你裁切视频黑边方法
现在的大多数电视是16:9的宽屏,而大多数视频都是4:3的标清或是16:9的高清。当你看一个标清或高清视频时,如果它的比例与你的电视屏幕比例不同,视频两侧就会出现黑边。这些黑边会对视频的质量或观看体验产生影响,那么怎么处理呢&am…...
如何设计一个Android端高性能日志监控系统
开发中客户端经常遇到一些线上问题, 无法复现, 但是又的的确确存在; 当线上反馈的时候无从下手; 主要是因为并不知道用户所处的环境,以及所做的操作顺序或者程序运行的顺序; 在排查问题和复现问题上占用了很大的成本; 如果debug时的log日志如果线上也能查看就好了; 基于此, 我们…...
maven下载按照及初次使用相关配置
maven下载按照及初次使用相关配置 一、下载 与安装 依赖Java,需要配置JAVA_HOME设置MAVEN自身的运行环境,需要配置MAVEN_HOME测试环境配置结果 MVN测试成功!!! 二、本地仓库配置 Maven启动后,会自动保…...
opencv05-掩膜
参考: https://blog.csdn.net/shuiyixin/article/details/88825549 #include <iostream> #include <opencv2/highgui/highgui.hpp> #include <opencv2/opencv.hpp> #include <vector> #include <array> #include <algorithm>u…...
通讯软件013——分分钟学会Kepware OPC AE Server仿真配置
本文介绍如何使用Kepware软件仿真OPC AE Server配置。相关软件可登录网信智汇(wangxinzhihui)下载。 1、创建1个数据源:本案例采用“Graybox.Simulator.1”作为数据源。连接OPC Server数据源“Graybox.Simulator.1”。 右键点击“连通性”&am…...
Windows下安装Hive(包安装成功)
Windows下安装Hive Hive与Hadoop的版本选择很关键,千万不能选错,否则各种报错。一、Hive下载1.1、官网下载Hive1.2、网盘下载Hive 二、解压安装包,配置Hive环境变量2.1、环境变量新增:HIVE_HOME2.2、修改Path环境变量,…...
count(列名) ,count(1)与count(*) 有何区别?
Mysql版本:8.0.26 可视化客户端:sql yog 文章目录 一、Mysql之count函数简介二、count(列名) ,count(常量)与count(*) 有何区别?2.1 统计字段上的区别2.2 执行效率上的区别 一、Mysql之count函数简介 👉表达式 COUNT(…...
SmolVLA企业应用:轻量级VLA模型赋能AGV分拣与桌面机械臂
SmolVLA企业应用:轻量级VLA模型赋能AGV分拣与桌面机械臂 1. 引言:当机器人开始“看懂”世界 想象一下,你对着一个机械臂说:“把那个红色的方块拿起来,放到蓝色的盒子里。”然后它真的照做了。这不是科幻电影…...
万能学习方法论的理论建构与多领域适配性研究(乖乖数学)
万能学习方法论的理论建构与多领域适配性研究(乖乖数学)这篇题为《万能学习方法论的理论建构与多领域适配性研究》的博士学位论文提纲,展现了一个极为宏大、系统且雄心勃勃的理论构建尝试。它试图整合经典教育心理学理论(尤其是知…...
OpenClaw多模态实践:Qwen3-14B分析截图生成操作指南
OpenClaw多模态实践:Qwen3-14B分析截图生成操作指南 1. 为什么需要截图分析自动化 上周团队来了三位新同事,我需要反复演示软件操作流程。每次截屏标注步骤后,还要手动整理成PDF发送。这种重复劳动让我开始思考:能否让AI自动识别…...
别再为ChatTTS声音飘忽发愁了!手把手教你用Python代码+高质量.pt音色文件,生成稳定语音
用Python和优质音色文件打造稳定语音合成体验 语音合成技术正在改变内容创作的方式,但很多开发者在实际使用ChatTTS时都会遇到一个共同的困扰——生成的语音音色飘忽不定,每次输出都像开盲盒。这种不稳定性严重影响了专业场景下的使用体验,比…...
避坑指南:OpenClaw安装Qwen3-4B镜像的5大常见错误
避坑指南:OpenClaw安装Qwen3-4B镜像的5大常见错误 1. 为什么需要这份避坑指南 上周我在本地部署OpenClaw对接Qwen3-4B镜像时,连续踩了三个坑:先是npm版本冲突导致安装失败,接着模型地址格式写错导致连接超时,最后又遇…...
ShortURL MCP 集成指南
在今天的数字时代,短链接的生成和管理变得越来越重要。Ace Data Cloud 提供的 ShortURL MCP 服务器,利用 MCP (模型上下文协议),允许 AI 模型(如 Claude、GPT 等)通过标准化接口调用外部工具,从而更加便利地…...
Titanium SDK快速入门:10分钟创建你的第一个跨平台App
Titanium SDK快速入门:10分钟创建你的第一个跨平台App 【免费下载链接】titanium-sdk 🚀 Native iOS and Android Apps with JavaScript 项目地址: https://gitcode.com/gh_mirrors/ti/titanium-sdk Titanium SDK是一个强大的开源框架,…...
基于PLC的五自由度抓取机械手设计
P13-基于PLC的五自由度抓取机械手设计 资料包含: PLC梯形图和HMI组态运行画面,I/O分配、CAD原理图、硬件设备清单、软件安装包、运行讲解视频、设计报告说明等,解难问题,全套资料通俗易懂非常适合新手PLC编程学习参考 功能介绍&am…...
OpenClaw生活助手:Qwen3-4B-Thinking-2507-GPT-5-Codex-Distill-GGUF管理家庭购物清单与比价
OpenClaw生活助手:Qwen3-4B-Thinking-2507-GPT-5-Codex-Distill-GGUF管理家庭购物清单与比价 1. 为什么需要AI管理购物清单? 上周六早上,我站在超市冷藏柜前盯着三款不同品牌的有机牛奶发呆——这个场景已经重复了三个月。每次采购都要花20…...
51单片机实战:基于XPT2046的多传感器AD转换与LCD显示
1. 项目背景与核心器件选型 第一次接触51单片机AD转换时,我被各种专业术语搞得一头雾水。直到用XPT2046芯片完成了电位器、光敏电阻、热敏电阻的三路信号采集,才真正理解模拟信号数字化的奥妙。这个成本不到5元的触摸屏控制芯片,其实是个隐藏…...
