JAVA----Thread(2

news2024/9/22 23:24:54

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.setDaemon
        
        t.start();
    }
}

未设置为后台线程输出

hello thread
hello thread
hello thread
hello thread
hello thread

Process 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.IllegalThreadStateException
	at java.lang.Thread.setDaemon(Thread.java:1359)
	at thread.Test.main(Test.java:16)
hello thread
hello thread
hello thread
hello thread
hello thread

Process 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.coloradmin.cn/o/1645494.html

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

相关文章

vue+element-ui实现横向长箭头,横向线上下可自定义文字(使用after伪元素实现箭头)

项目场景&#xff1a; 需要实现一个长箭头&#xff0c;横向线上下可自定义文字 代码描述 <div><span class"data-model">{{ //上方文字}}</span><el-divider class"q"> </el-divider>//分隔线<span class"data-mod…

一竞技MSI:淘汰赛抽签结果出炉 BLG和T1同半区,TES首轮交手TL!

北京时间5月6日&#xff0c;MSI在今天进入短暂的休赛&#xff0c;在昨天结束的入围赛之后&#xff0c;PSG战队作为外卡赛区唯一的队伍进入到正赛&#xff0c;另外欧洲赛区的FNC战队也是击败GAM战队拿到正赛的资格。在比赛结束之后&#xff0c;也是进行了淘汰赛的胜败分组赛的抽…

前端css中animation(动画)的使用

前端css中animation的使用 一、前言二、主要内容说明&#xff08;一&#xff09;、animation-name&#xff08;名称&#xff09;属性&#xff08;二&#xff09;、animation-duration&#xff08;持续时间&#xff09;属性1.前两个属性举例&#xff0c;源码12.源码1运行效果&am…

unity制作app(5)--发送数据给数据库

这个之前做过&#xff0c;先不做照片的。下一节再做带照片的。 第一步 收集数据 1.先做一个AppModel结构体&#xff0c;这个结构体需要单做的。 using System; using System.Collections.Generic; using System.Linq; using System.Text; //using Assets.Model; public clas…

STM32单片机实战开发笔记-I2C通讯总线【wulianjishu666】

嵌入式单片机开发实战例程合集&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/11av8rV45dtHO0EHf8e_Q0Q?pwd28ab 提取码&#xff1a;28ab I2C模块测试 功能描述 I2C总线接口连接微控制器和串行I2C总线。它提供多主机功能&#xff0c;控制所有I2C总线特定的时序&am…

微信小程序原生代码实现小鱼早晚安打卡小程序

大家好&#xff0c;我是雄雄&#xff0c;欢迎关注微信公众号&#xff1a;雄雄的小课堂 小鱼早晚安打卡小程序&#xff1a;开启健康生活&#xff0c;共享正能量 在这个快节奏的时代&#xff0c;我们常常被各种琐事和压力所困扰&#xff0c;以至于忽略了对健康生活方式的追求。然…

Linux—-vim基础使用

1、基本概念 Vim的工作模式有四种&#xff0c;普通模式&#xff0c;输入模式&#xff0c;命令模式&#xff0c;可视模式。 在终端中打开vim&#xff0c;只需要输入vim 文件&#xff0c;在普通模式下按i就会进入到输入模式&#xff0c;按下:进入命令模式&#xff0c;输入:q就可…

Error: error:0308010C:digital envelope routines::unsupported 问题如何解决

Error: error:0308010C:digital envelope routines::unsupported 通常与 Node.js 的加密库中对某些加密算法的支持有关。这个错误可能是因为 Node.js 的版本与某些依赖库不兼容导致的。特别是在 Node.js 17 版本中&#xff0c;默认使用 OpenSSL 3&#xff0c;而一些旧的加密方式…

第3章 WebServer重构

3.1 重构原生Web服务框架 3.1.1 分析原生Web服务框架 在服务端代码的 ClientHandler 中&#xff0c;请求解析、处理请求、返回响应的代码混杂在一起&#xff0c;这样的设计会导致代码难以维护和理解。为了提高代码的可读性、可维护性和可扩展性&#xff0c;我们需要对这些代码…

18.Blender 渲染工程、打光方法及HDR贴图导入

HDR环境 如何导入Blender的HDR环境图 找到材质球信息 在右上角&#xff0c;点击箭头&#xff0c;展开详细部分 点击材质球&#xff0c;会出现下面一列材质球&#xff0c;将鼠标拖到第二个材质球&#xff0c;会显示信息 courtyard.exr 右上角打开已渲染模式 左边这里选择世界…

【Elasticsearch<四>✈️✈️】SpringBoot 项目整合 Elasticsearch

目录 &#x1f378;前言 &#x1f37b;一、Elasticsearch 本地环境启动 &#x1f37a;二、SpringBoot 项目整合 Elasticsearch 2.1 引入 ES 依赖 2.2 配置 ES 属性 2.3 创建实体类 2.4 操作 ES 的工具类 2.5 操作 ES 的业务层 &#x1f379;三、接口测试 3.1 编写测试类 3…

【信息安全】密码学

信息验证遇到的问题Message Authentication In the context of communications across a network, the following attacks can be identified. 泄密Disclosure 流量分析Traffic analysis 伪装Masquerade Content modification Sequence modification Time modification …

一、写给Android开发者之harmony入门

一、创建新项目 对比 android-studio&#xff1a;ability类似安卓activity ability分为两种类型(Stage模型) UIAbility和Extensionability&#xff08;提供系统服务和后台任务&#xff09; 启动模式 1、 singleton启动模式&#xff1a;单例 2、 multiton启动模式&#xff1…

学习Rust的第29天: cat in Rust

今天即将是这个系列的最后一次内容&#xff0c;我们正在catRust 中从 GNU 核心实用程序进行重建。cat用于将文件内容打印到STDOUT.听起来很容易构建&#xff0c;所以让我们开始吧。 GitHub 存储库&#xff1a;GitHub - shafinmurani/gnu-core-utils-rust 伪代码 function read(…

Django实验(远程访问+图片显示)

众所周知&#xff0c;Python除了不能生孩子什么都会。Python也是可以做web服务的。 Python做web有一个重点优势是&#xff1a;做一个快速的AI Demo。 第一步&#xff1a;安装一个版本5.0以上django 第二步&#xff1a;构建咱们的Django工程&#xff0c;我取名为BBQ django-adm…

基于 Ubuntu22.04 安装 SSH 服务

文章目录 一、Ubuntu22.04 安装 SSH 服务二、配置 OpenSSH&#xff08;安全性&#xff09;1. 更改 OpenSSH 端口2. 限制使用 SSH 登录尝试次数3. 禁止 SSH 以 root 身份连接 三、设置防火墙&#xff08;UFW&#xff09;锁定 SSH四、远程终端软件通过 SSH 连接 Ubuntu22.041. 远…

js api part4

其他事件 页面加载事件 外部资源&#xff08;如图片、外联CSS和JavaScript等&#xff09;加载完毕时触发的事件 原因&#xff1a;有些时候需要等页面资源全部处理完了做一些事情&#xff0c;老代码喜欢把 script 写在 head 中&#xff0c;这时候直接找 dom 元素找不到。 事件…

实测好评!微信自动回复消息神器!高效沟通拿捏住!

随着企业规模的扩大和客户数量的增加&#xff0c;有效管理和回复每一条消息变得越来越具有挑战性。今天&#xff0c;就给大家分享一个高效的自动回复消息神器——个微管理系统&#xff0c;让你能够轻松应对各种沟通需求。 1、自动通过好友&#xff0c;提高沟通效率 每当有新的…

AI神助攻!小白也能制作自动重命名工具~

我们平时从网上下载一些文件&#xff0c;文件名很多都是一大串字母和数字&#xff0c;不打开看看&#xff0c;根本不知道里面是什么内容。 我想能不能做个工具&#xff0c;把我们一个文件夹下面的所有word、excel、ppt、pdf文件重命名为文件内容的第一行。 我们有些朋友可能不会…

PHP基于B/S版 医院不良事件管理系统源码vscode+laravel8医院如何加强不良事件上报系统的管理 AEMS系统源码

PHP基于B/S版 医院不良事件管理系统源码vscodelaravel8医院如何加强不良事件上报系统的管理 AEMS系统源码 医院安全&#xff08;不良&#xff09;事件管理AEMS系统AEMS采用无责的、自愿的填报不良事件方式&#xff0c;有效地减轻医护人员的思想压力&#xff0c;实现以事件为主要…