JAVA----Thread(2

Thread 提供的属性和方法

目录

  • Thread 提供的属性和方法
    • 一.构造方法
      • 1.Thread() :
      • 2.Thread(Runnable target) :
      • 3.Thread(String name) :
        • main 线程
      • 4.Thread(Runnable target, String name) :
    • 二.属性
        • 1.ID (getId)
        • 2.名称(getName)
        • 3.状态(getState)
        • 4.优先级 (getPriority)
        • 5.是否后台线程 (isDaemon)
        • 6.是否存活(isAlive)
          • isAlive()
        • 7.是否被中断(isUnterrupted)

一.构造方法

1.Thread() :

创建线程对象;

2.Thread(Runnable target) :

使用 Runnable 对象创建线程对象;

3.Thread(String name) :

创建线程对象, 并命名;
起名有一个好处: java 进程运行过程中, 可以通过工具看到每个不同线程的名字.
出现问题时, 更直观的把问题线程和代码关联起来(方便调试),
没起名字, 也有默认名字: Thread-0, Thread-1, Thread-2.

当我们运行此代码

package Thread;
public class Demo1 {public static void main(String[] args) {Thread t = new Thread(()->{while(true){System.out.println("hello");try {Thread.sleep(1000);} catch (InterruptedException e) {throw new RuntimeException(e);}}},"自定义线程");//起名t.start();}
}

打开 jconsole - 线程 可以看见
在这里插入图片描述
但是我们仔细看下, 这里看不见 main 线程了, 此处并不是main线程没有被创建, 而是其执行太快, 结束而销毁了.

main 线程

main 线程是通过 jvm 中通过 C++ 代码创建出来的, 没有通过 java 中的 Thread 类创建, 也就不会重写 run

4.Thread(Runnable target, String name) :

使用 Runnable 对象创建线程对象, 并命名;
同上

[了解] Thread(ThreadGroup group, Runnable target) : 线程可以被用来分组管理, 分好的组进行批量控制;
这种写法在实际开发中更多的被线程池取代了.

二.属性

在这里插入图片描述

1.ID (getId)

是线程的唯一标识, 不同线程 不会重复;
与系统内核的 pcb 的 id 是一一对应但不相同的, 是 jvm 自己搞的一套 id 体系.
java代码无法获取到 pcb 中的 id.

2.名称(getName)

在各种调试工具可用到;

3.状态(getState)

表示线程当前所处的一个情况; (就绪 + 阻塞)

4.优先级 (getPriority)

优先级高的线程理论上更容易被调度到;
有些形同虚设, 优先级还是得看系统调度

5.是否后台线程 (isDaemon)

前台线程 :
此线程不结束, java 进程一定不会结束.(可以有多个, 当最后一个前台线程结束, java进程结束)
在 java 中, main 线程, 就是前台线程. 另外程序员创建出来的线程, 默认情况下都是 前台线程.
后台进程 :
此线程即使继续执行, 也不能阻止 java 进程 结束.(不希望此线程, 影响java进程结束)
可以通过 setDaemon 方法 来把线程设置成 后台线程.
在这里插入图片描述
像上图 jvm 内置线程 就是 后台线程

后台线程比如 有的线程负责 gc(垃圾回收) , gc 是要周期性持续性执行的,不可能主动结束.

栗子

package thread;public class Test {public static void main(String[] args) {Thread t = new Thread(() -> {for (int i = 0; i < 5; i++) {System.out.println("hello thread");try {Thread.sleep(1000);} catch (InterruptedException e) {throw new RuntimeException(e);}}});//设置为后台线程//t.setDaemont.start();}
}

未设置为后台线程输出

hello thread
hello thread
hello thread
hello thread
hello threadProcess finished with exit code 0

只要 t 线程 未结束, 进程不结束.
main 执行完, start结束.

设置为后台进程输出

Process finished with exit code 0

当设置t为后台线程, 只有main是前台线程了,
main执行完 start 就结束了.t 线程没来得及打印.(线程之间是抢占式执行).
大概率是什么也不打印.

若将 setDaemon 放在 start 后将会发生什么

package thread;public class Test {public static void main(String[] args) {Thread t = new Thread(() -> {for (int i = 0; i < 5; i++) {System.out.println("hello thread");try {Thread.sleep(1000);} catch (InterruptedException e) {throw new RuntimeException(e);}}});t.start();//设置为后台线程t.setDaemon(true);}
}
Exception in thread "main" java.lang.IllegalThreadStateExceptionat java.lang.Thread.setDaemon(Thread.java:1359)at thread.Test.main(Test.java:16)
hello thread
hello thread
hello thread
hello thread
hello threadProcess finished with exit code 1

此处发生了报错, 并且设置后台线程未生效.
关于各种属性设置, 都要放在 start 之前

6.是否存活(isAlive)

指的是系统中的线程 (PCB) 是否还存在.(Thread的生命周期)

Thread 对象的生命周期, 和 PCB 的生命周期是不一定完全相同的.

package thread;
public class Test {public static void main(String[] args) {Thread t = new Thread(() -> {          });t.start();Thread.sleep(1000);}
}

因为

  Thread t = new Thread(() -> {});

这个代码已经创建了 Thread 实例, 诞生了Thread对象,
但是, 此时, 内核中的 PCB 没有诞生.

t.start();

这个代码, 才是真正的在系统中创建出线程
PCB 才真正的被创建出来并且加入到链表中.

由于t 线程中什么都没写, 所以t 瞬间结束, 内核中的线程和 pcb 就被销毁了.
但是在 sleep 结束之前, t 引用 指向的 Thread 对象 仍然存在, 并且没有被gc回收.
则会出现, 系统中的线程先结束掉了, 但 t 仍存在.

isAlive()
package thread;
public class Test {public static void main(String[] args) {Thread t = new Thread(() -> {          });t.start();Thread.sleep(1000);System.out.println(t.isAlive());}
}
false
package thread;
public class Test {public static void main(String[] args) throws InterruptedException {Thread t = new Thread(() -> {try {Thread.sleep(2000);} catch (InterruptedException e) {throw new RuntimeException(e);}});t.start();Thread.sleep(1000);System.out.println(t.isAlive());}
}
true
7.是否被中断(isUnterrupted)

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

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

相关文章

leetcode-岛屿数量-99

题目要求 思路 1.使用广度优先遍历&#xff0c;将数组中所有为1的元素遍历一遍&#xff0c;遍历过程中使用递归&#xff0c;讲该元素的上下左右四个方向的元素值也置为0 2.统计一共执行过多少次&#xff0c;次数就是岛屿数量 代码实现 class Solution { public:int solve(vec…

线程安全问题、同步代码块、同步方法

线程安全问题就是 用线程同步来解决线程安全问题 同步&#xff1a;一个线程接着一个线程等待执行 同步代码块&#xff1a; 通过锁来解决卖到重复票的问题&#xff1a;卖票问题和存钱取钱问题&#xff08;见其他两篇文章&#xff09; 同步方法&#xff1a;

【算法练级js+java】旋转字符串判断是否相等

每一天一道算法题训练&#xff0c;努力打开编程思维&#xff0c;才能进大厂光明正大的泡心仪的小姐姐&#xff01;&#xff01;(手动捂脸) 题目 /** * 给定字符创A和B * 旋转字符串A,就是把最左边的移动到最右边 * 比如A‘abcde’,在移动一次之后结果就是bcdea * 如果若干次之…

最全网络安全学习路线!涵盖所有知识点,看这一篇掌握网安技能!

目录 零基础小白&#xff0c;到就业&#xff01;入门到入土的网安学习路线&#xff01; 建议的学习顺序&#xff1a; 一、夯实一下基础&#xff0c;梳理和复习 二、HTML与JAVASCRIPT&#xff08;了解一下语法即可&#xff0c;要求不高&#xff09; 三、PHP入门 四、MYSQL…

加密/解密--数字信封/数字签名/数字证书

what 加密 加密&#xff1a;加密就是对原来为明文的文件或数据按某种算法进行处理&#xff0c;使其成为一 段不可读的代码&#xff0c;通常称为 “密文”。从而达到保护数据不被非法窃取的目的。 解密 数据加密的逆向过程&#xff0c;将加密的数据转换为明文 加/解密工作机…

C语言队列的含义与队列数据操作代码详解!

引言&#xff1a;于本篇博客当中&#xff0c;我们将讲到数据结构——队列的有关知识。而对于这次的队列&#xff0c;我们将会在单链表的基础上实现。 更多有关C语言和数据结构知识详解可前往个人主页&#xff1a;计信猫 一&#xff0c;队列的含义 队列是一种特殊的线性表&#…

使用 SSH 连接 GitHub Action 服务器

前言 Github Actions 是 GitHub 推出的持续集成 (Continuous integration&#xff0c;简称 CI) 服务它提供了整套虚拟服务器环境&#xff0c;基于它可以进行构建、测试、打包、部署项目&#xff0c;如果你的项目是开源项目&#xff0c;可以不限时使用服务器硬件规格&#xff1…

DrissionPage

声明 本文章中所有内容仅供学习交流使用&#xff0c;不用于其他任何目的&#xff0c;不提供完整代码&#xff0c;抓包内容、敏感网址、数据接口等均已做脱敏处理&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff01;本文章未经许…

Java请求第三方接口的一些步骤

一、前言 Java请求第三方接口的一些步骤。 在Java中请求第三方接口通常涉及以下步骤。这些步骤涵盖了从准备请求到处理响应的整个过程。 1. 确定接口详情 接口URL&#xff1a;你要请求的URL。请求方法&#xff1a;如GET、POST、PUT、DELETE等。请求参数&#xff1a;包括URL…

微型显示器可以实时监测大脑活动

美国团队开发基于LED的设备&#xff0c;以可视化大脑活动&#xff0c;在脑外科手术中指导神经外科医生 来自加州大学圣地亚哥分校和马萨诸塞州总医院的工程师和医生开发了一种薄膜显示设备&#xff0c;该设备结合了电极网格和特殊的GaN LED&#xff0c;可以在手术过程中实时跟…

多线程学习Day07

共享模型之不可变 从一个日期转换的问题开始 Slf4j(topic "c.Test1") public class Test1 {public static void main(String[] args) {SimpleDateFormat sdf new SimpleDateFormat("yyyy-MM-dd");for (int i 0; i < 10; i) {new Thread(() -> {…

buuctf-misc题目练习二

ningen 打开题目后是一张图片&#xff0c;放进winhex里面 发现PK&#xff0c;PK是压缩包ZIP 文件的文件头&#xff0c;下一步是想办法进行分离 Foremost可以依据文件内的文件头和文件尾对一个文件进行分离&#xff0c;或者识别当前的文件是什么文件。比如拓展名被删除、被附加…

元素设置 flex:1,但是会被内部长单词宽度超出拉伸

初始布局如上图&#xff0c;left中是代码编辑器&#xff0c;实际上是个文本域&#xff0c;当输入长文本过长时&#xff0c;left宽度会被拉伸。 右侧容器被挤压。 解决方案&#xff1a;width&#xff1a;0&#xff1b; .left{flex:1; width:0} 当输入长文本过长时&#xff0c…

保姆级零基础微调大模型(LLaMa-Factory,多卡版)

此处非常感谢https://github.com/hiyouga/LLaMA-Factory这个项目。 看到网上的教程很多都是教如何用webui来微调的,这里出一期命令行多卡微调教程~ 1. 模型准备 模型下载比较方便的方法: 1. modelscope社区(首选,速度很高,并且很多需要申请的模型都有)注意要选择代码…

HTML4(二)

文章目录 1 开发者文档2 基本标签2.1 排版标签2.2 语义化标签2.3 行内元素与块级元素2.4 文本标签2.5 常用标签补充 3 图片标签4 超链接标签4.1 跳转页面4.2 跳转文件4.3 跳转锚点4.4 唤起指定应用 5 列表5.1 有序列表5.2 无序列表5.3 自定义列表 6 表格6.1 基本结构6.2 表格标…

【Android】Kotlin学习之数据容器(数组创建)

kotlin数组 数组是一种初始化时指定容器大小, 不可以动态调整其大小的容器 数组创建

WPF之改变任务栏图标及预览

1&#xff0c;略缩图添加略缩按钮。 <Window.TaskbarItemInfo><TaskbarItemInfo x:Name"taskInfo" ProgressState"None" ProgressValue"0.6" ><TaskbarItemInfo.ThumbButtonInfos><ThumbButtonInfo x:Name"btiPlay&q…

雷伴品鉴【神农式】倪琴 倪诗韵古琴

雷伴品鉴【神农式】倪琴 倪诗韵古琴 此琴材质为老杉木音色细腻&#xff0c;下指按弹舒适&#xff0c;手感极好漆面精美&#xff0c;线条流畅。

OpenCV4.8 VS2019 MFC编程出现的诡异现象

OpenCV4.8及OpenCV4.4 VS2019MFC编程在调用imred&#xff08;&#xff09;函数时&#xff0c;debug X64试运行没问题。 release X64试运行时出现下面错误。 void CEasyPictureDlg::OnBnClickedOpen() {CFileDialog fdlg(TRUE, NULL, 0, OFN_HIDEREADONLY | OFN_OVERWRITEPROMP…

私人健身教练预约管理小程序开发源码现成案例(小程序+APP+H5 源码部署)

一、私人健身教练预约管理系统-环境介绍 1.1 私人健身教练预约管理系统-运行环境 开发语言&#xff1a;PHP 数据库&#xff1a;MySQL 系统架构&#xff1a;TP 后端&#xff1a;SpringBoot 前端&#xff1a;Vue 2. 私人健身教练预约管理系统-系统介绍。 2.1私人健身教练预约管…