【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,一经查实,立即删除!

相关文章

昇思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…

基于微信小程序的自习室选座系统/基于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.…

MQTTX连接华为云IoTDA

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

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

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

CefSharp音视频编译与免费下载

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

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

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

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

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

leetcode日记(49)旋转链表

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

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

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

C# datetimePicker

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

Stage模型应用程序包结构

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

jetbrains 、IntelliJ IDEA、PyCharm 等工具英语音译读音

本心、输入输出、结果 文章目录 jetbrains 、IntelliJ IDEA、PyCharm 等工具英语音译读音前言jetbrains 、IntelliJ IDEA、PyCharm 等工具英语音译读音jetbrains 、IntelliJ IDEA、PyCharm 等工具英语音译读音 编辑 | 简简单单 Online zuozuo 地址 | https://blog.csdn.net/qq_…

go-kratos 学习笔记(6) 数据库gorm使用

数据库是项目的核心,数据库的链接数据是data层的操作,选择了比较简单好用的gorm作为数据库的工具;之前是PHP开发,各种框架都是orm的操作;gorm还是很相似的,使用起来比较顺手 go-kratos官网的实例是ent&…

逆向案例二十九——某品威客登录,请求头参数加密,简单webpack

网址:登录- 一品威客网,创新型知识技能共享服务平台 抓到登陆包分析,发现请求头有参数加密,直接搜索 定位到加密位置,打上断点,很明显是对象f的a方法进行了加密。 往上找f,可以发现f被定义了,是…

pc端vue2实现截图功能

npm install js-web-screen-shot --save import ScreenShort from "js-web-screen-shot"; <button @click="screenhotFnc">点我截图</button> //最后生成一个数组,base格式,可循环渲染到页面上面 screenhotFnc() {new ScreenShort({//ap…

Android中Service学习记录

目录 一 概述二 生命周期2.1 启动服务startService()2.2 绑定服务bindService()2.3 先启动后绑定2.4 先绑定后启动 三 使用3.1 本地服务&#xff08;启动式&#xff09;3.2 可通信的服务&#xff08;绑定式&#xff09;3.3 前台服务3.4 IntentService 总结参考 一 概述 Servic…

【Android】广播机制

【Android】广播机制 前言 广播机制是Android中一种非常重要的通信机制&#xff0c;用于在应用程序之间或应用程序的不同组件之间传递信息。广播可以是系统广播&#xff0c;也可以是自定义广播。广播机制主要包括标准广播和有序广播两种类型。 简介 在Android中&#xff0c…