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 模板文件更新数据。…

Go语言高级特性

目录 1. 并发编程 1.1 Goroutine轻量级线程 1.2 Channel通信机制 1.3 WaitGroup等待组 1.4 Mutex互斥锁 2. 垃圾回收机制 2.1 内存管理介绍 2.2 垃圾回收原理 2.3 性能调优策略 2.4 常见问题及解决方案 3. 接口与反射 3.1 接口定义与实现 3.2 空接口与类型断言 3…

【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、效果

centos7下vim命令笔记-查找字符

一.查找字符 在 Vim 中&#xff0c;你可以使用正则表达式来查找字符。以下是一些基本的查找命令&#xff1a; 正向查找&#xff1a;在命令模式下&#xff0c;输入 / 后跟你想要查找的字符或者表达式&#xff0c;然后按回车。例如&#xff0c;查找字符 a&#xff0c;你可以输入…

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

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

打工人遇到霸总领导:听话、背锅、随叫随到 | 最新快讯

文定焦&#xff0c;作者温故、星星、布鲁斯、向园&#xff0c;编辑星星 近期&#xff0c;璩静这位前百度公关副总裁出了名。不仅连续两天登上热搜&#xff0c;还被海内外各大媒体报道。 事情要从几个月前说起&#xff0c;按照媒体引用知情人士的说法&#xff0c;璩静要求公关部…

CMake 学习笔记(访问Python)

CMake 学习笔记&#xff08;访问Python&#xff09; 利用Python可以做很多事情。比如&#xff1a; 利用 Python 自动生成一些代码。 在我们的程序中植入一个 Python 解释器。 为了做这些事情。就需要 CMake 能够知道 python 装在哪里&#xff0c;装的是什么版本的 python&a…

亚马逊广告怎么优化?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;特别是在三维场景…