JavaEE之线程(3)_线程的开始、中断、等待、休眠线程、线程的状态

前言

 在本栏的上一节(https://blog.csdn.net/2301_80653026/article/details/138500558),我们重点讲解了五种不同的创建线程的方式,我们还介绍了Tread类的常见构造方法和常见属性,在这一节中我们将会继续介绍Tread类。


一、启动一个线程 start( )

 在上一节我们讲解了如何通过覆写 run 方法创建一个线程对象,但线程对象被创建出来并不意味着线程就开始运行了。比如:

  1. 覆写 run 方法是提供给线程要做的事情的指令清单
  2. 线程对象可以认为是把 李四、王五叫过来了
  3. 而调用 start( ) 方法,就是喊一声:”行动起来!“,线程才真正独立去执行了

调用 start 方法, 才真的在操作系统的底层创建出一个线程。
Thread类中run和start的区别:

作用功能不同:
 1. run方法的作用是描述线程具体要执行的任务;
 2. start方法的作用是真正的去申请系统线程
.运行结果不同:
 1. run方法是一个类中的普通方法,主动调用和调用普通方法一样,会顺序执行一次;
 2. start调用方法后, start方法内部会调用Java 本地方法(封装了对系统底层的调用)真正的启动线程,并执行run方法中的代码,run 方法执行完成后线程进入销毁阶段

参考示例代码:

/*** @author Zhang* @date 2024/4/2915:16* @Description:*///创建一个类,继承自Thread
class  MyThread extends  Thread{//这个方法就是线程的入口方法@Overridepublic void run() {// System.out.println("hello Thread");while(true){System.out.println("hello threat");try {Thread.sleep(1000);  //休眠1000毫秒/*** 此处必须try catch,不能throws* 在这个代码中重写的是父类的run,父类的run没有throws,因此,子类方法也就不能有throws*/} catch (InterruptedException e) {throw new RuntimeException(e);}}}
}//创建线程
public class Demo1 {public static void main(String[] args) throws InterruptedException {Thread t = new MyThread();//start 和run都是Threat的成员//run只是描述了线程的入口(线程要做生么任务)//start 则是真正调用了系统API,在系统中创建线程,让线程再调用runt.start();while(true){System.out.println("hello main");Thread.sleep(1000);  //休眠1000毫秒}}
}

二、中断一个线程

停止一个线程主要有以下两种方式:

2.1 通过共享的标记来进行沟通

参考实例代码:

/*** @author Zhang* @date 2024/5/415:58* @Description:*/
public class Demo8 {private  static  boolean isQuit = false;  //成员变量public static void main(String[] args) throws InterruptedException {//  boolean isQuit = false; 不能使用局部 变量Thread t=  new Thread(()->{while(!isQuit){//System.out.println("线程工作中");//此处的打印可以替换成任意的逻辑来表示逻辑的实际工作内容try {Thread.sleep(1000);} catch (InterruptedException e) {throw new RuntimeException(e);}}System.out.println("线程作完毕");});t.start();Thread.sleep(5000);isQuit = true;System.out.println("设置 isQuit 为 true");}
}

2.2 调用interrupt( )方法来通知

 使用 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 中代码的写法, 可以选择忽略这个异常, 也可以跳出循环结束线程

  1. 否则,只是内部的一个中断标志被设置,thread 可以通过

Thread.interrupted() 判断当前线程的中断标志被设置,清除中断标志
Thread.currentThread().isInterrupted() 判断指定线程的中断标志被设置,不清除中断标志

/*** @author Zhang* @date 2024/5/416:27* @Description:*/
public class Demo9 {public static void main(String[] args)  {Thread t = new Thread(() ->{//Thread类内部,有一个现成的标志位,可以判定当前的循环是否结束while(!Thread.currentThread().isInterrupted()){System.out.println("线程工作中");try {Thread.sleep(1000);} catch (InterruptedException e) {//throw new RuntimeException(e);//1.假装没听见,循环继续正常执行e.printStackTrace();// 2.加上一个break,表示线程立即结束//break;//3.先做一些其他工作,完成之后再结束//其他工作的代码//break;}}});t.start();try {Thread.sleep(5000);} catch (InterruptedException e) {throw new RuntimeException(e);}System.out.println("线程终止");t.interrupt();}
}

三、 等待一个线程join( )

 有时,我们需要等待一个线程完成它的工作后,才能进行自己的下一步工作

参考实例代码:

/*** @author Zhang* @date 2024/5/416:54* @Description:*/
public class Demo10 {public static void main(String[] args) throws InterruptedException {Thread t =  new Thread(()->{for (int i = 0; i<5;i++ ){System.out.println("t 线程工作中");try {Thread.sleep(1000);} catch (InterruptedException e) {throw new RuntimeException(e);}}});t.start();//让主线程等待t线程执行结束//一旦调用join,主线程就会出发阻塞。此时t线程就可以趁机完成后续的工作//一直阻塞到 t 执行完毕了, join才会解除阻塞,才能继续执行System.out.println("join 等待开始");t.join();//t.join 工作过程://   1)如果t线程正在运行中,此时调用 join 的线程就会阻塞, 一直阻塞到t线程执行结束为止//   2)如果t线程已经执行结束了,此时调用 join 线程,就直接返回了,不会涉及到阻塞~~System.out.println("join 等待结束");}
}

其他一些 join( )方法

四、获取当前线程引用 和 休眠当前线程

4.1 获取当前线程引用

常见方法:public static Thread currentThread(); ——返回当前线程对象的引用
参考代码实例

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

4.2 休眠当前线程

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());}
}

五、 线程的状态

在这里插入图片描述
在这里插入图片描述

总结

 好啦!以上就是今天要讲的内容,本文介绍了Thread类的start( )方法、线程的的中断、等待一个线程join( )、获取当前线程的引用,休眠当前线程,以及线程的引用。在本栏的下一节我们将会继续介绍Thread中重点内容——线程安全。

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

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

相关文章

简单的Python HTML 输出

1、问题背景 一名初学者在尝试将 Python 脚本输出到网页上时遇到了一些问题。他当前使用 Python 和 HTML 进行开发&#xff0c;并且遇到了以下问题&#xff1a; 担心自己的代码过于复杂&#xff0c;尤其是 WebOutput() 函数。希望通过 JavaScript 使用 HTML 模板文件更新数据。…

【PG数据库】PostgreSQL 日志归档详细操作流程

1.1 日志归档的目的 pg数据库日志归档是将PostgreSQL数据库的日志文件进行归档的过程。 归档的主要目的是为了保留历史数据&#xff0c;确保数据的一致性和完整性&#xff0c;同时为数据恢复提供必要的支持。 pg数据库日志归档的目的包括&#xff1a; 1.数据恢复&#xff1…

Tomcat中服务启动失败,如何查看启动失败日志?

1. 查看 localhost.log 这个日志文件通常包含有关特定 web 应用的详细错误信息。运行以下命令查看 localhost.log 中的错误&#xff1a; sudo tail -n 100 /opt/tomcat/latest/logs/localhost.YYYY-MM-DD.log请替换 YYYY-MM-DD 为当前日期&#xff0c;或选择最近的日志文件日…

【打工日常】云原生之搭建一款轻量级的开源Markdown笔记工具

一、flatnotes介绍 1.flatnotes简介 一个自托管的&#xff0c;无数据库的笔记网络应用程序&#xff0c;利用平面文件夹的markdown文件进行存储。 2.项目特点 A.干净简单的用户界面B.响应式移动端界面C.原生/所见即所得Markdown编辑模式D.高级搜索功能E.笔记“标签”功能F.…

Java入门基础学习笔记12——变量详解

变量详解&#xff1a; 变量里的数据在计算机中的存储原理。 二进制&#xff1a; 只有0和1&#xff0c; 按照逢2进1的方式表示数据。 十进制转二进制的算法&#xff1a; 除二取余法。 6是110 13是1101 计算机中表示数据的最小单元&#xff1a;一个字节&#xff08;byte&…

【mysql篇】执行delete删除大量数据后,磁盘未清空,为什么?

目录 迁移脚本删除数据以及备份数据 解决方法OPTIMIZE TABLE二进制日志按月生成数据 最近某个项目虽说用户量不大&#xff0c;但是&#xff0c;单表的数据量越来越大&#xff0c;mysql一般单表超过千万级别后&#xff0c;性能直线下降&#xff0c;所以利用shardingphere按月做了…

用python进行接口测试(详细教程)

前言 其实我觉得接口测试很简单&#xff0c;比一般的功能测试还简单&#xff0c;现在找工作好多公司都要求有接口测试经验&#xff0c;也有好多人问我什么是接口测试&#xff0c;本着不懂也要装懂的态度&#xff0c;我会说&#xff1a;所谓接口测试就是通过测试不同情况下的入…

mac内存不足怎么清理?有哪些免费的软件工具?

当你的mac电脑使用一段时间之后&#xff0c;你可能就会发现&#xff0c;原本非常流畅的运行开始出现卡顿的现象&#xff0c;此时正是mac内存不足的外在表现。可mac内存不足怎么清理呢&#xff0c;别急&#xff0c;清理内存的方式方法有很多&#xff0c;小编将结合实际情况给大家…

免费实用在线AI工具集合

免费在线工具 https://orcc.online/ 在线录屏 https://orcc.online/recorder pdf在线免费转word文档 https://orcc.online/pdf 时间戳转换 https://orcc.online/timestamp Base64 编码解码 https://orcc.online/base64 URL 编码解码 https://orcc.online/url Hash(MD5/SHA…

网络安全专业岗位详解+自学学习路线图

很多网安专业同学一到毕业就开始迷茫&#xff0c;不知道自己能去做哪些行业&#xff1f;其实网络安全岗位还是蛮多的&#xff0c;下面我会介绍一些网络安全岗位&#xff0c;大家可以根据自身能力与喜好决定放哪个方向发展。 渗透测试/Web安全工程师 主要是模拟黑客攻击&#…

苹果电脑怎么安装crossover 如何在Mac系统中安装CrossOver CrossOver Mac软件安装说明

很多Mac的新用户在使用电脑的过程中&#xff0c;常常会遇到很多应用软件不兼容的情况。加上自己以前一直都是用Windows系统&#xff0c;总觉得Mac系统用得很难上手。 其实&#xff0c;用户可以在Mac上安装CrossOver&#xff0c;它支持用户在Mac上运行Windows软件&#xff0c;例…

Win10鼠标右键新增软件快速打开项

1、cmd 运行 regedit 2、找到该位置的shell文件夹 3、在shell文件夹下创建需要添加的软件名的文件夹&#xff0c;并修改相关信息 4、新建子文件夹command&#xff0c;并修改相关信息 5、效果

十天学会单片机可能吗?单片机入门需要多久?

在开始前我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「单片机的资料从专业入门到高级教程」&#xff0c; 点个关注在评论区回复“888”之后私信回复“888”&#xff0c;全部无偿共享给大家&#xff01;&#xff01;&#xff01; 十天学“会”单片机&#xf…

亚马逊广告怎么优化?11条口诀请谨记

对于亚马逊卖家来说&#xff0c;想要销量好&#xff0c;亚马逊广告是不可或缺的&#xff01;那么卖家要如何优化亚马逊广告才可以获得更好的效果呢&#xff1f;今天给大家分享11条亚马逊广告优化口诀&#xff0c;赶紧收藏学起来吧&#xff01; 亚马逊广告优化口诀分享 1、曝光高…

党务政务服务热线|基于SSM的党务政务服务热线平台(源码+数据库+文档)

目录 基于SprinBootvue的党务政务服务热线平台 一、前言 二、系统设计 三、系统功能设计 1系统功能模块 2后台功能模块 5.2.1管理员功能模块 5.2.2部门功能模块 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&#xff1a; …

2D-3D 转换中,为什么世界坐标要扩充成四维, 图像坐标要扩充成三维?

总结 在计算机视觉和图形学中&#xff0c;将世界坐标扩充成四维&#xff0c;以及图像坐标扩充成三维&#xff0c;是为了便于运用齐次坐标&#xff08;homogeneous coordinates&#xff09;进行坐标变换。这样的做法简化了投影变换的数学表示和计算&#xff0c;特别是在三维场景…

python + word文本框中文字识别并替换【真替换,不只是识别】

1. 简单描述 在一些转换场景下&#xff0c;文本框不会被转换&#xff0c;需要先识别成文字内容。 【识别的文字段落可能会和实际看到的效果有些差异&#xff0c;后续还需校对&#xff0c;如下图】。 不足&#xff1a;除了上面说的那个情况&#xff08;上图说的问题&#xff0…

【桌面应用开发】Rust+Tauri框架项目打包操作

1.项目npm install下载项目依赖&#xff08;需要配置好node.js环境&#xff09; 可参考&#xff1a;https://blog.csdn.net/m0_64346565/article/details/138319651 2.自定义图标&#xff08;项目初始化开始第一次需要配置生成&#xff0c;后面可跳过这一步骤&#xff09; Ta…

ESP32引脚入门指南(七):从理论到实践(IIC)

引言 IIC&#xff08;Inter-Integrated Circuit&#xff09;&#xff0c;又称为IC&#xff0c;是一种简单而高效的多主控器串行通信协议&#xff0c;常用于微控制器和各种外围设备之间的通信。在ESP32系列芯片中&#xff0c;IIC协议被广泛应用于连接各种传感器、存储器和其他支…

机器学习-Numpy

机器学习-Numpy 如果一个人拒绝提高自己的思想觉悟&#xff0c;那么他只能处在弱小、可怜、凄惨的境地。 目录 机器学习-Numpy 1.Numpy&#xff1a;生成矩阵 做矩阵运算 1&#xff09;创建矩阵 ①使用列表创建 ②使用元组创建 2&#xff09;矩阵取值 3&#xff09;numpy…