【JavaEE初阶】Thread类及常见方法

目录

📕 Thread类的概念

📕 Thread 的常见构造方法

📕 Thread 的几个常见属性

📕 start()-启动一个线程

📕 中断一个线程

🚩 实例一

🚩 实例二

🚩 实例三

📕 join()-等待一个线程

🚩获取当前线程引用

🚩休眠当前线程


📕 Thread类的概念

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

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

📕 Thread 的常见构造方法

前面两个构造方法上述在前面已经讲过,第三个和第四个构造方法是可以在创建线程的时候,给线程起个名字,是否起名字对于线程运行的效果并没有影响,好处是Java运行过程中,可以看到每个线程的名字,出问题的时候更直观的把出现的问题和代码联系起来(方便调试),通过jconsole / IDEA调试器都能看到线程名字,若没起名字,也有默认的名字Thread-0,Thread-1,Thread-2....

取名:

📕 Thread 的几个常见属性

常见属性说明:

  • ID 是线程的唯一标识,不同线程不会重复,这里的id和pcb的id是不同的,是jvm自己搞的一套体系,Java代码也无法获取到pcb的id

  • 名称是各种调试工具用到

  • 状态表示线程当前所处的一个情况,后面会一一介绍

  • 优先级高的线程理论上来说更容易被调度到,但是虽然Java提供了优先级接口,实际上修改了优先级接口现象也不是很明显,你修改的优先级是一回事,系统调度又是另一回事,你这里的优先级只能是一个"建议参考",具体还得以人家自身为准

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

例子:

将 t 线程设为后台线程:此时进程中只有main是前台进程了,只要main结束,整个进程就结束了,main执行完 start 立即结束,此时 t 线程还没有来得及打印,进程就结束了,里面的线程也自然随之结束了,所以什么也打印不出来。 

注意:此处也有一定的概率出现 t 打印一次,然后进程结束的情况,就是看main先执行结束还是t还执行一次(线程之间是抢占式执行,调度顺序不确定),但是按照经验来看,当前代码结构中,大概率是什么都不打印,即使你尝试运行1w次,结构可能都是什么都不打印,但是不能保证1w零1次是否打印!!!概率不均等的原因是main调用start的速度很快,对于 t 来说,要把线程创建出来之后才会执行打印,但是创建的本事有时间开销,虽然比进程的创建轻量,也不是为0,相对于main来说要更慢!!!

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

指的是系统中的线程(pcb)是否还存在,Thread对象的声命周期和pcb的生命周期不一定完全一样

例子:

更改:

正因为Thread类和系统中的线程生命周期不一致,因此就可以通过上述谈到的 isAlive 方法,判定系统中的线程是否仍然存在

判断出当前这个线程是否存货(指的是内核中的线程,与对象本身没有关系),此时现在进程已经结束了,得到的结果为false。

当我们把线程中睡眠加上,因为线程中是sleep(2000),下面是sleep(1000),进行打印的时候try—>catch中的还没有睡醒,即线程还存在,所以结果为true。

  • 线程的中断问题,下面会进一步说明

上述属性中名称,后台线程,是否存货了解的重点!!!

注意,上述属性一定是写在 start 之前的!!!

📕 start()-启动一个线程

start 才是正在的创建线程(在内核中创建pcb),一个线程需要通过run/lambda把线程要执行的任务定义出来,start 才是正在的创建线程,并开始执行

核心就是是否真正的创建线程出来,每个线程都是独立调度执行的(相当于整个程序中多了一个执行流,即多了一个while死循环,并发执行)

一个 Thread 对象只能 start 一次

要想在搞一个新的线程,就需要要创建另一个 Thread 类对象

📕 中断一个线程

与其叫中断,不如说终止,中断整个词在计算机中包含很多意思。

🚩 实例一

1,自己实现,控制线程结束的代码例子

我们不在while中写true,自己创建一个boolean类型的变量来作为while的条件,让其3s之后,修改变量的值来结束 t 线程,这样让main线程去决定 t 线程结束这样的效果,所谓让 t 线程结束,就是让线程的入口方法执行完毕,对于while来说就是结束循环即可

上述代码,我们是把isRunning定义成的一个成员变量,若把他定义成一个局部变量,代码就会直接编译报错,

如果上述代码 t 线程是睡眠10s,甚至更长,此时的main线程是无法及时的把 t 线程终止掉,就有 Thread 类提供的方法来实现。

🚩 实例二

2,使用 Thread 类提供的interrupt方法和 isInterruptted方法,来实现上述效果

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

刚才是自己定义了一个boolean变量,实际上Thread里面内置了一个,使用内置的标志位,功能更强大!!!

🚩 实例三

观察标志位是否清除

所以可以认为interrupt方法,线程中有sleep,就会唤醒sleep,若代码没有执行到sleep,就还是一个单纯的设置标志位。

📕 join()-等待一个线程

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

例如,张三只有等李四转账成功,才决定是否存钱,这时我们需要一个方法明确等待线程的结束

例子:

由于线程是"抢占式"执行且并发执行,所以谁先结束每次都是不确定的,如果希望让代码里面的 t 先结束,main后结束,就可以在main中使用线程等待(join)。

可以认为谁调用jion谁就阻塞,比如代码中有main线程,又有t1和t2线程,此时main调用t1.join,mian就阻塞,然后t1和t2并发执行,如果t1打印比t2打印的时间短,那么此时t1和t2一起打印,当t1打印完之后,t2还没有打印完,main线程已经回到就绪态,那么t2就和main一起打印。

在main线程中调用两个join:

t1和t2之间相互等待:

此时的代码就是t1等待t2,main线程又在等待t1

还可以其他线程等待main:(非常规写法)

上述只是join无参数版本的,也就是死等,只要 t 不结束,就会一直等待下去,还要带参数的版本

在实际开发中,一般很少使用死等这个策略

传入一个时间:传入的时间是最大等待时间,比如写的等待10s,如果10s之内,t 线程结束了之间返回,如果10s到了,t 线程还没有结束不等了!!!继续往下走。(第三种方法纳秒级别的时间,对于主流系统来说,更精细了会导致误差)

🚩获取当前线程引用

这个方法我们以及非常熟悉了,前面都已经使用过了,就不做过多赘述了

🚩休眠当前线程

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

sleep方法是native修饰的,底层是C++代码写的

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

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

相关文章

Android中的usescleartexttraffic属性详解

Android中的usescleartexttraffic属性详解 usesCleartextTraffic 是 Android 应用程序开发中的一个重要配置选项,用于控制应用程序是否允许通过不加密的 HTTP 协议进行网络通信。在 Android 应用的开发过程中,正确地配置 usesCleartextTraffic 对于保护用…

昇思MindSpore学习入门-数据处理管道支持python对象

数据处理管道中的特定操作(如自定义数据集GeneratorDataset、自定义map增强操作、自定义batch(per_batch_map...))支持任意Python类型对象作为输入。为了支持此特性,数据管道使用了Python(dict)字典去管理不同类型的对象。与其他类型相比&…

康康近期的慢SQL(oracle vs 达梦)

近期执行的sql,哪些比较慢? 或者健康检查时搂一眼状态 oracle: --最近3天内的慢sql set lines 200 pages 100 col txt for a65 col sql_id for a13 select a.sql_id,a.cnt,a.pctload,b.sql_text txt from (select * from (select sql_id,co…

Nvm和Npm和Pm2的关系和使用说明

一、三者关系说明 nvm、npm 和 pm2 在 Node.js 生态系统中扮演着不同的角色,但它们之间存在一定的关联。下面是每个工具的作用以及它们之间的关系:1. nvm (Node Version Manager)• nvm 是一个用于管理多个 Node.js 版本的工具。它允许用户在不同的项目…

基于微信小程序的自习室选座系统/基于Java的自习室选座系统/自习室管理系统的设计与实现

获取源码联系方式请查看文章结尾🍅 摘要 自习室选座是学校针对用户必不可少的一个部分。在学校的整个过程中,学生担负着最重要的角色。为满足如今日益复杂的管理需求,各类微信小程序自习室选座也在不断改进。本课题所设计的小程序自习室选座系…

【C#】Visual Studio2022打包依赖第三方库的winForm程序为exe

0.简介 IDE:VS2022 平台:C# .NetFramework4.7.2 WinForm界面 有GDAL、EEplus第三方库的依赖,所以在其他未安装环境的电脑中功能无法使用。 1. 安装 1.1 运行文件输出 在VS扩展中选择管理扩展,安装:Microsoft Visua…

SpringBoot上传超大文件导致OOM,完美问题解决办法

问题描述 报错: Caused by: java.lang.OutOfMemoryError at java.io.ByteArrayOutputStream.hugeCapacity(ByteArrayOutputStream.java:123) ~[?:1.8.0_381] at java.io.ByteArrayOutputStream.grow(ByteArrayOutputStream.java:117) ~[?:1.8.0_381] at java.…

Android 更换applicationId 后 微信没有回调

1、解决办法&#xff08;代码如下&#xff09;&#xff1a; 使用 <activity-alias>: 这是一个用于定义活动别名的元素。活动别名可以让您为已经定义的活动提供一个别名&#xff0c;从而可以通过别名启动原来的活动。 <activityandroid:name".wxapi.WXEntryActiv…

ES6 class 类

普通使用原型添加方法 function Animal(name) {this.name name; }Animal.prototype.speak function() {console.log(this.name makes a noise.); };function Dog(name) {Animal.call(this, name); }Dog.prototype Object.create(Animal.prototype); Dog.prototype.constr…

MQTTX连接华为云IoTDA

目录 华为IoTDA平台 MQTTX连接参数的设置 物模型的构建 属性上报 基本数据格式 时戳 我以前上课都是用巴法云服务器来演示MQTT的&#xff0c;前几天因为测试工业互联网关使用了华为的IoTDA&#xff0c;觉得也不算太复杂&#xff0c;今天尝试用MQTTX连接华为云&#xff0c…

【ARM】MDK-STM32g0xx.h文件与Define规则记录

【更多软件使用问题请点击亿道电子官方网站】 1、 文档目标 记录问题STM32g0xx.h等有关ST的可读文件&#xff0c;尽量勿修改文件格式及对其代码进行添加和删减&#xff0c;记录查找问题的过程中的疑惑&#xff0c;并如何给予客户正确的回复&#xff0c;帮助销售完成验收&…

CefSharp音视频编译与免费下载

注&#xff1a;Cefharp 音频和视频播放编译&#xff0c;生成相应的dll文件&#xff0c;从而支持项目开发。 建议编译至少 16G 的 RAM和至少 250G 的 SSD。该脚本以 E 盘为例&#xff0c;您需要在 E 盘上手动创建 cef 文件夹。禁止在转载后通过发布其他平台向用户收取下载费用。…

C++笔记5

目录 图的基础问题 图上的环 无向图的环 DAG图与拓扑排序 拓扑排序 卡恩算法&#xff08;BFS&#xff09; 算法描述 统计图中每个点的入度&#xff08;即连向该点的边数&#xff09; 拓扑排序的DFS算法 算法描述 拓扑排序的DFS的实现简单&#xff0c;从一个入度为0的…

新形势下职业教育大数据人才培养策略

一、引言 随着信息技术的飞速发展&#xff0c;大数据已成为驱动经济社会变革的关键力量。在新形势下&#xff0c;职业教育作为技术技能人才培养的重要阵地&#xff0c;面临着如何适应大数据时代要求、提升人才培养质量的紧迫任务。当前&#xff0c;职业教育在大数据人才培养方…

云HIS系统源码,业务云协同和数据云协同的数字化医院信息系统

云HIS是利用云计算、大数据、物联网、移动互联网等技术&#xff0c;打造的一个安全、便捷、共享、协同的医疗互联网云生态平台。核心功能是业务云协同和数据云协同。云HIS具有可扩展、易共享、易协同、低成本、体验号、更便捷、易维护的优势&#xff0c;重新定义了数字化医院信…

leetcode日记(49)旋转链表

其实不难&#xff0c;就是根据kk%len判断需要旋转的位置&#xff0c;再将后半段接在前半段前面就行。 /*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode() : val(0), next(nullptr) {}* ListNode(int x) : …

uniapp的h5,读取本地txt带标签的文件

效果图 使用的回显的标签是u-parse&#xff0c;下面的网址讲了这个标签的相关 https://www.cnblogs.com/huihuihero/p/12978903.html 导入此插件 https://ext.dcloud.net.cn/plugin?id364 使用 uni.request({// 本地文件url: "/static/互联网医院医师端用户协议.txt…

C# datetimePicker

1. 直接把控件拉到设计器中&#xff0c;此时不要调整控件的values属性&#xff0c;这样就可以 打开后每次默认显示当天日期。 2. 属性Format long长日期格式默认值short短日期格式Time时间格式custom自定义时间格式在customFormat这个属性设置&#xff0c;比如yyyy-MM-dd HH…

Stage模型应用程序包结构

目录 官网地址 官网结构图 开发态包结构 工程目录结构 配置文件 module.json5配置文件 app.json5配置文件 官网地址 官网地址 包结构 官网结构图 开发态包结构 在DevEco Studio上创建一个项目工程&#xff0c;并尝试创建多个不同类型的Module&#xff08;类似一个一个的页…

C 语言基础概念总结

C 语言基础概念总结 一、数据类型 目录 C 语言基础概念总结 一、数据类型 基本数据类型 构造数据类型 二、变量与常量 三、运算符与表达式 算术运算符 关系运算符 逻辑运算符 赋值运算符 自增自减运算符 四、控制流语句 顺序结构 选择结构 循环结构 五、函数 …