完整教程:Java EE初阶启程记03---Thread类及常见方法

news/2025/10/2 9:29:32/文章来源:https://www.cnblogs.com/wzzkaifa/p/19123215

 个人主页:寻星探路

作者简介:Java研发方向学习者

个人专栏:、《

⭐️人生格言:没有人生来就会编程,但我生来倔强!!!



目录

1、Thread的常见构造方法

2、Thread的几个常见属性

3、启动一个线程---start()

4、中断一个线程

5、等待一个线程---join()

6、获取当前线程引用

7、休眠当前线程


        Thread类是JVM用来管理线程的一个类,换句话说,每个线程都有一个唯一的Thread对象与之关联。

        用我们上面的例子来看,每个执行流,也需要有⼀个对象来描述,类似下图所示,而Thread类的对象就是用来描述一个线程执行流的,JVM会将这些Thread对象组织起来,用于线程调度,线程管理。

1、Thread的常见构造方法

 Thread t1 = new Thread();Thread t2 = new Thread(new MyRunnable());Thread t3 = new Thread("这是我的名字");Thread t4 = new Thread(new MyRunnable(), "这是我的名字");

2、Thread的几个常见属性

        ID是线程的唯一标识,不同线程不会重复

        名称是各种调试工具用到

        状态表示线程当前所处的⼀个情况,下面我们会进一步说明

        优先级高的线程理论上来说更容易被调度到

        关于后台线程,需要记住一点:JVM会在一个进程的所有非后台线程结束后,才会结束运行。

        是否存活,即简单的理解,为run方法是否运行结束了

        线程的中断问题,下面我们进一步说明

public class ThreadDemo {public static void main(String[] args) {Thread thread = new Thread(() -> {for (int i = 0; i < 10; i++) {try {System.out.println(Thread.currentThread().getName() + ": 我还活着");Thread.sleep(1 * 1000);} catch (InterruptedException e) {e.printStackTrace();}}System.out.println(Thread.currentThread().getName() + ": 我即将死去");});System.out.println(Thread.currentThread().getName() + ": ID: " + thread.getId());System.out.println(Thread.currentThread().getName() + ": 名称: " + thread.getName());System.out.println(Thread.currentThread().getName() + ": 状态: " + thread.getState());System.out.println(Thread.currentThread().getName() + ": 优先级: " + thread.getPriority());System.out.println(Thread.currentThread().getName() + ": 后台线程: " + thread.isDaemon());System.out.println(Thread.currentThread().getName() + ": 活着: " + thread.isAlive());System.out.println(Thread.currentThread().getName() + ": 被中断: " + thread.isInterrupted());thread.start();while (thread.isAlive()) {}System.out.println(Thread.currentThread().getName() + ": 状态: " + thread.getState());}}

3、启动一个线程---start()

        之前我们已经看到了如何通过覆写run方法创建⼀个线程对象,但线程对象被创建出来并不意味着线程就开始运行了。

        覆写run方法是提供给线程要做的事情的指令清单

        线程对象可以认为是把李四、王五叫过来了

        而调用start()方法,就是喊⼀声:”行动起来!“,线程才真正独立去执行了。

调用start方法,才真的在操作系统的底层创建出一个线程

4、中断一个线程

        李四⼀旦进到工作状态,他就会按照行动指南上的步骤去进行工作,不完成是不会结束的。但有时我们需要增加⼀些机制,例如老板突然来电话了,说转账的对方是个骗子,需要赶紧停止转账,那张三该如何通知李四停止呢?这就涉及到我们的停止线程的方式了。

目前常见的有以下两种方式:

1)通过共享的标记来进行沟通

2)调用interrupt()方法来通知

示例---1:使用自定义的变量来作为标志位

需要给标志位上加volatile关键字(这个关键字的功能后面介绍)

public class ThreadDemo {private static class MyRunnable implements Runnable {public volatile boolean isQuit = false;@Overridepublic void run() {while (!isQuit) {System.out.println(Thread.currentThread().getName()+ ": 别管我,我忙着转账呢!");try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}}System.out.println(Thread.currentThread().getName()+ ": 啊!险些误了⼤事");}}public static void main(String[] args) throws InterruptedException {MyRunnable target = new MyRunnable();Thread thread = new Thread(target, "李四");System.out.println(Thread.currentThread().getName() + ": 让李四开始转账。");thread.start();Thread.sleep(10 * 1000);System.out.println(Thread.currentThread().getName()+ ": ⽼板来电话了,得赶紧通知李四对⽅是个骗⼦!");target.isQuit = true;}
}

示例---2:使用Thread.interrupted()或者Thread.currentThread().isInterrupted()代替自定义标志位

Thread内部包含了一个boolean类型的变量作为线程是否被中断的标记

        使用thread对象的 interrupted() 方法通知线程结束

public class ThreadDemo {private static class MyRunnable implements Runnable {@Overridepublic void run() {// 两种⽅法均可以while (!Thread.interrupted()) {//while (!Thread.currentThread().isInterrupted()) {System.out.println(Thread.currentThread().getName()+ ": 别管我,我忙着转账呢!");try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();System.out.println(Thread.currentThread().getName()+ ": 有内⻤,终⽌交易!");// 注意此处的 breakbreak;}}System.out.println(Thread.currentThread().getName()+ ": 啊!险些误了⼤事");}}public static void main(String[] args) throws InterruptedException {MyRunnable target = new MyRunnable();Thread thread = new Thread(target, "李四");System.out.println(Thread.currentThread().getName()+ ": 让李四开始转账。");thread.start();Thread.sleep(10 * 1000);System.out.println(Thread.currentThread().getName()+ ": ⽼板来电话了,得赶紧通知李四对⽅是个骗⼦!");thread.interrupt();}}

thread收到通知的方式有两种:

1)如果线程因为调用wait/join/sleep等方法而阻塞挂起,则以InterruptedException异常的形式通 知,清除中断标志

        当出现InterruptedException的时候,要不要结束线程取决于catch中代码的写法,可以选择忽 略这个异常,也可以跳出循环结束线程

2)否则,只是内部的一个中断标志被设置,thread可以通过         Thread.currentThread().isInterrupted()判断指定线程的中断标志被设置,不清除中断标志这种方式通知收到的更及时,即使线程正在sleep也可以马上收到。

5、等待一个线程---join()

        有时,我们需要等待一个线程完成它的工作后,才能进行自己的下一步工作。例如,张三只有等李四转账成功,才决定是否存钱,这时我们需要⼀个方法明确等待线程的结束。

public class ThreadDemo {public static void main(String[] args) throws InterruptedException {Runnable target = () -> {for (int i = 0; i < 10; i++) {try {System.out.println(Thread.currentThread().getName() + ": 我还在⼯作!");Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}}System.out.println(Thread.currentThread().getName() + ": 我结束了!");
};Thread thread1 = new Thread(target, "李四");Thread thread2 = new Thread(target, "王五");System.out.println("先让李四开始⼯作");thread1.start();thread1.join();System.out.println("李四⼯作结束了,让王五开始⼯作");thread2.start();thread2.join();System.out.println("王五⼯作结束了");}
}

大家可以试试如果把两个join注释掉,现象会是怎么样的呢?

6、获取当前线程引用

        这个方法我们已经非常熟悉了

public class ThreadDemo {public static void main(String[] args) {Thread thread = Thread.currentThread();System.out.println(thread.getName());}
}

7、休眠当前线程

        也是我们比较熟悉⼀组方法,有⼀点要记得,因为线程的调度是不可控的,所以,这个方法只能保证实际休眠时间是大于等于参数设置的休眠时间的

 public class ThreadDemo {public static void main(String[] args) throws InterruptedException {System.out.println(System.currentTimeMillis());Thread.sleep(3 * 1000);System.out.println(System.currentTimeMillis());}}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/924744.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

在AI技术唾手可得的时代,挖掘用户真实需求成为产品成功的关键——某知名设备电量监控工具需求探索

本文基于某知名设备电量监控工具的文档和用户反馈,深入分析其核心功能和应用场景,并重点挖掘用户提出的新功能需求,为产品迭代提供有价值的参考方向。内容描述核心功能定位:该项目是一款专注于在Mac系统上监控和管…

岐山网站开发广州花都区网站建设

或按照S5PV210学习秩序。我们首先解决的关键问题。TQ335x有六个用户按钮&#xff0c;每个上、下、剩下、对、Enter和ESC。我想开始学习S5PV210当同一&#xff0c;写输入子系统驱动器的关键问题要解决&#xff0c;但浏览driver/input/keyboardgpio-keys.c&#xff0c;大体上看下…

wordpress 网站显示加载时长山东建设厅官方网站二建报名

vue创建完项目以后如果报parsing error no babel config file。。。这样的错误的话&#xff0c;关闭项目&#xff0c;用vscode进入项目中打开项目就可以解决了。 1 代码保存的时候会自动将单引号报错为双引号 导致eslint报错的问题&#xff0c; 解决思路&#xff1a; 在项目根…

网站设计用什么软件做的抚州律师网站建设

Date.parse() 方法解析一个表示某个日期的字符串&#xff0c;并返回从1970-1-1 00:00:00 UTC 到该日期对象&#xff08;该日期对象的UTC时间&#xff09;的毫秒数&#xff0c;如果该字符串无法识别&#xff0c;或者一些情况下&#xff0c;包含了不合法的日期数值&#xff08;如…

2025 年润滑脂厂家 TOP 企业品牌推荐排行榜,道达尔润滑脂,工业润滑脂,合成润滑脂,高温润滑脂,轴承润滑脂推荐这十家公司!

在当前工业生产领域,润滑脂作为保障设备稳定运行的关键耗材,其品质与供应服务的重要性日益凸显。然而,市场上润滑脂品牌数量众多,产品质量参差不齐,给企业采购带来诸多困扰。部分品牌存在产品参数不达标、供应链不…

2025切割机厂家TOP企业品牌推荐排行榜,五轴水刀,大理石水刀,全自动水刀,高压水刀,手持式水刀,高压水刀,大理石水刀,便携式水刀切割机公司推荐!

在当前制造业快速发展的背景下,切割机作为关键加工设备,其市场需求持续攀升,但行业也面临诸多亟待解决的问题。一方面,市场上切割机品牌数量众多,产品质量参差不齐,部分厂家为追求短期利益,在生产过程中降低标准…

二十八、API之《System 类》——与框架交互的“桥梁”

二十八、API之《System 类》——与框架交互的“桥梁”pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas&qu…

2025橡胶木板材厂家TOP企业品牌推荐排行榜,泰国橡胶木板材,橡胶木免漆板,橡胶木 PET,橡胶木门板,AA 橡胶木,橡胶木指接板公司推荐!

在当下的家居建材市场中,橡胶木板材凭借其出色的性价比、良好的物理性能以及丰富的应用场景,备受消费者与行业从业者的青睐。然而,随着市场的蓬勃发展,各类橡胶木板材品牌如雨后春笋般涌现,质量参差不齐,这给消费…

网站建设哪家公司便宜wordpress游客投稿

类 类的基本特性 数据抽象和封装继承多态 1 类的构成——抽象 概念 数据抽象是一种依赖于接口和实现的分离的编程技术。类的接口包括用户所能执行的操作&#xff1b;类的实现包括类的数据成员、负责接口实现的函数体以及定义类所需要的的各种私有函数。封装实现了类的接口和实…

2025润滑油供应商最新权威推荐排行榜:聚焦耐磨润滑油、工业润滑油、鑫美工业润滑油、壳牌润滑油、道达尔润滑油助力企业采购决策

当前工业领域对润滑油的需求持续增长,但市场乱象却让企业采购面临诸多难题。部分供应商缺乏合规供货渠道,产品无原厂认证与溯源体系,假冒伪劣产品导致设备故障频发、运维成本激增;还有供应商供应链响应慢,紧急用油…

网站手机版二维码怎么做腾讯域名怎么做网站

编码是信息从一种形式或格式转换为另一种形式的过程&#xff0c;也称为计算机编程语言的代码简称编码。 用预先规定的方法将文字、数字或其它对象编成数码&#xff0c;或将信息、数据转换成规定的电脉冲信号。 编码在电子计算机、电视、遥控和通讯等方面广泛使用。 解码&#x…

多状态循环泵控件开发

所遇问题 描述:在使用定时器设置泵的运行状态时 ,可以成功运行 ,但是会一卡一卡的这里猜测的是定时器时间设置过短导致它本身一个周期还未运行完成就重新开启下一轮的运行 但是将时间设置大了之后 ,结果并不是这样…

2025活塞杆厂家TOP企业品牌推荐排行榜,精密,不锈钢,调制,超长,油缸,气缸,镀铬,大直径,精细活塞杆推荐这十家公司!

在当前工业自动化快速发展的背景下,活塞杆作为液压油缸、气缸等关键执行部件的核心连接部件,其质量与性能直接影响着众多行业设备的运行精度和使用寿命。然而,当下活塞杆市场呈现出较为复杂的局面,不同制造商的产品…

藁城外贸网站建设投稿 wordpress

官网&#xff1a;https://spring.io/projects/spring-cloud 官方说法&#xff1a;Spring Cloud 为开发人员提供了快速构建分布式系统中一些常见模式的工具&#xff08;例如配置管理、服务发现、熔断器、智能路由、微代理、控制总线、一次性令牌、全局锁、领导选举、分布式会话…

实用指南:WSL2搭建Hadoop伪分布式环境

实用指南:WSL2搭建Hadoop伪分布式环境pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Mon…

3整数规划-分支定界法

分支定界法(Branch and Bound Method 一、分支定界法概述 1. 定义与定位 分支定界法是求解 整数规划问题(纯整数、混合整数、0-1规划)的 核心全局优化算法,由 Land 和 Doig 于1960年提出。 其核心思想是通过“分支…

西安网站建设服务网站备案个人使用

Android Deobfuscation11/11/2019本文内容ProGuard、DexGuard 和 R8 是用于对 Android 应用程序的代码进行优化和模糊处理的工具。 它会删除未使用的代码、重命名具有语义模糊名称的类、字段和方法&#xff0c;使基本代码更小&#xff0c;更难反向工程。 若要在 Android 应用中…

完整教程:Ubuntu 系统安装 Prometheus+Grafana(附shell脚本一键部署↓)

完整教程:Ubuntu 系统安装 Prometheus+Grafana(附shell脚本一键部署↓)pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family…

网站的设计与制作论文题目成都高端网站建设哪家好

这世界上有后悔药– www.houhuiyao.cc 后悔药数据恢复 站长语前面的内容也提到过update或delete误更新删除了数据后如何恢复。实际生产环境中常常因各种不同场景导致一些办法有效一些办法无效&#xff0c;当然&#xff0c;最有效的办法依然是备份&#xff01;虽然啰嗦&#xff…

重庆市住房和城乡建设部网站自己怎么开发app软件

文章目录 性能比较区别使用方式和行为 性能比较 最终总结&#xff1a;如果数据在1万以内的话&#xff0c;for循环效率高于foreach和stream&#xff1b;如果数据量在10万的时候&#xff0c;stream效率最高&#xff0c;其次是foreach,最后是for。另外需要注意的是如果数据达到10…