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(…...
应用升级/灾备测试时使用guarantee 闪回点迅速回退
1.场景 应用要升级,当升级失败时,数据库回退到升级前. 要测试系统,测试完成后,数据库要回退到测试前。 相对于RMAN恢复需要很长时间, 数据库闪回只需要几分钟。 2.技术实现 数据库设置 2个db_recovery参数 创建guarantee闪回点,不需要开启数据库闪回。…...
基于ASP.NET+ SQL Server实现(Web)医院信息管理系统
医院信息管理系统 1. 课程设计内容 在 visual studio 2017 平台上,开发一个“医院信息管理系统”Web 程序。 2. 课程设计目的 综合运用 c#.net 知识,在 vs 2017 平台上,进行 ASP.NET 应用程序和简易网站的开发;初步熟悉开发一…...
【HarmonyOS 5.0】DevEco Testing:鸿蒙应用质量保障的终极武器
——全方位测试解决方案与代码实战 一、工具定位与核心能力 DevEco Testing是HarmonyOS官方推出的一体化测试平台,覆盖应用全生命周期测试需求,主要提供五大核心能力: 测试类型检测目标关键指标功能体验基…...
oracle与MySQL数据库之间数据同步的技术要点
Oracle与MySQL数据库之间的数据同步是一个涉及多个技术要点的复杂任务。由于Oracle和MySQL的架构差异,它们的数据同步要求既要保持数据的准确性和一致性,又要处理好性能问题。以下是一些主要的技术要点: 数据结构差异 数据类型差异ÿ…...
第25节 Node.js 断言测试
Node.js的assert模块主要用于编写程序的单元测试时使用,通过断言可以提早发现和排查出错误。 稳定性: 5 - 锁定 这个模块可用于应用的单元测试,通过 require(assert) 可以使用这个模块。 assert.fail(actual, expected, message, operator) 使用参数…...
ETLCloud可能遇到的问题有哪些?常见坑位解析
数据集成平台ETLCloud,主要用于支持数据的抽取(Extract)、转换(Transform)和加载(Load)过程。提供了一个简洁直观的界面,以便用户可以在不同的数据源之间轻松地进行数据迁移和转换。…...
【python异步多线程】异步多线程爬虫代码示例
claude生成的python多线程、异步代码示例,模拟20个网页的爬取,每个网页假设要0.5-2秒完成。 代码 Python多线程爬虫教程 核心概念 多线程:允许程序同时执行多个任务,提高IO密集型任务(如网络请求)的效率…...
零基础设计模式——行为型模式 - 责任链模式
第四部分:行为型模式 - 责任链模式 (Chain of Responsibility Pattern) 欢迎来到行为型模式的学习!行为型模式关注对象之间的职责分配、算法封装和对象间的交互。我们将学习的第一个行为型模式是责任链模式。 核心思想:使多个对象都有机会处…...
在Mathematica中实现Newton-Raphson迭代的收敛时间算法(一般三次多项式)
考察一般的三次多项式,以r为参数: p[z_, r_] : z^3 (r - 1) z - r; roots[r_] : z /. Solve[p[z, r] 0, z]; 此多项式的根为: 尽管看起来这个多项式是特殊的,其实一般的三次多项式都是可以通过线性变换化为这个形式…...
第7篇:中间件全链路监控与 SQL 性能分析实践
7.1 章节导读 在构建数据库中间件的过程中,可观测性 和 性能分析 是保障系统稳定性与可维护性的核心能力。 特别是在复杂分布式场景中,必须做到: 🔍 追踪每一条 SQL 的生命周期(从入口到数据库执行)&#…...
