线程属性详解

news2024/11/24 2:02:08

目录

catch语句

catch语句简介

catch语句中的内容

线程的属性

Thread提供的属性和方法

线程的属性方法

前台线程

后台线程

是否存活


catch语句

catch语句简介

我们首先认识一下catch语句,catch语句是用来捕获异常,在catch代码块中可以在捕获异常后进行执行。当我们创建一个线程,并且让创建的线程等待主线程执行完毕后再进行执行,此时会调用start方法。

此时可以看到调用sleep()函数时发生了错误,这是为什么呢?通过查看源码:

sleep()函数抛出了一个Interrupted异常,也就是说在执行sleep函数时可能使程序在正常执行时被中断,此时我们可以使用try catch语句进行异常的捕获,保证程序的正常执行。我们给程序加上try catch语句:

class MyThread extends Thread {
    @Override
    public void run() {
        for (int i = 0; i < 3; i++) {
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
            System.out.println("thread 1 启动!!!");
        }
    }
}
public class Main {
    public static void main(String[] args) {
        Thread t1 = new MyThread();
        t1.start();
        for (int i = 0; i < 3; i++) {
            System.out.println("main函数正常执行");
        }
    }
}

运行程序,可以看到程序正常执行,t1线程等待1s后开始执行,此时main线程已经执行完毕。

我们再回头看catch语句中的代码:

        try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }

try语句表示捕获异常,包含需要抛出异常的方法,当异常被捕获后,执行catch代码块中的代码,catch中的throw new RuntimeException(e)表示抛出新的异常,也就是说我们此时对异常的处理是抛出异常,如果调用printStackTrace()方法,则是打印异常信息。

catch语句中的内容

在实际的开发中,catch中的代码是我们自己定义的,一般包括:

1.打印一些日志,把出现异常的详情都记录在日志中

2.触发重试类的操作

3.触发一些”回滚“类的操作

4.触发一些警报机制,用来提醒程序猿。

线程的属性

Thread提供的属性和方法

以下为构造方法

Thread(),创建线程对象。

Thread(Runnable target),使用Runnable对象创建线程对象。

Thread(String name),创建线程对象,并命名。

Thread(Runable,name),使用Runnable对象创建线程对象,并且命名。

补充: 是否起名字对于线程本身没有任何影响,起名在java程序运行过程中,可以通过工具看到不同线程的名称,方便调试,关于工具(jconsloe)的使用为在上一篇博客中已经讲过。如果没有起名字,每个线程都有默认的名字,如Thread-0,Thread-1,Thread-2······。

特别提醒:main线程的创建并没有通过重写run()方法来实现,这是应为main线程是jvm通过c++代码创建出来的,没有通过java中的Thread类创建,也就不会重写run()方法。

线程的属性方法

1.ID,使用getid()方法获取。(此处id和系统中的pcb的id不一样,java代码获取不到线程的pid,这里的id为jvm提供的一套id体系)。

2.名称,使用getName()方法获取。

3.状态,使用getStart()方法获取。(阻塞和就绪状态)

4.优先级,使用getPriority()方法获取。(java提供了优先级的接口,但即使修改了优先级,作用任然不大,这里的优先级仅仅为一个建议,具体以系统的调度为准。)

5.是否后台线程,使用idDaemon()方法获取。

6.是否存活,使用isAlive()方法获取。

7.是否被中断,使用isInterrupten()方法获取。

前台线程

这种线程如果不运行结束,java的进程不会结束,或者说程序就不会执行结束。因此有多个前台线程,直到最后一个前台线程结束时,程序才会结束。在java代码中,main线程就是前台线程。

后台线程

这种线程,即使在运行,java程序也不会结束。程序猿创建出来的线程,默认情况下都是后台进程。但是我们可以通过setDaemon方法把线程设置为后台线程。什么情况下我们需要把线程设置成后台线程呢?当我不期望这个线程影响进程结束。比如,负责gc(垃圾回收)的线程,gc是要周期持续性执行的,不可能主动结束,如果把它设置成前台进程,那么进程永远结束不了

是否存活

指的是线程中的PCB是否还存在。

Thread对象的生命周期和PCB的生命周期是不一定完全一样的。当我们使用匿名内部类创建Thread实例:

public class Main {
    public static void main(String[] args) {
        Thread t = new Thread(() -> {

        });
        System.out.println(t.isAlive());
    }
}

此时,Thread对象已经诞生了,但内核中的PCB还没有诞生。运行代码:

我们此时使用isAlive方法测试线程是否存在,可以看到返回结果为false,说明此时内核中的PCB不存在,当我们执行t.start()方法时,才是真正在系统中创建链表(PCB才真正创建出来并加入到链表中)。修改代码,加上线程的创建。运行查看结果:

结果仍然是false,这是为何呢?我在判断线程存活之前加入了一个打印语句,因为此时的线程内部没有执行任何逻辑,当程序运行时,创建的线程t瞬间就被销毁了 ,即被gc回收了,我们换一种方式查看线程是否被创建:

public class Main {
    public static void main(String[] args) {
        Thread t = new Thread(() -> {
            try {
                Thread.sleep(100000);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
        });
        t.start();
        System.out.println("hello liangll");
        System.out.println(t.isAlive());
    }
}

此时,我让线程进入等待状态,那么它就不会被gc回收了,运行查看结果:

 

加入sleep()函数后,t线程在设置的短时间内不会被回收,此时可以看到main线程执行完打印函数之后返回的线程存活状态变为了true。此时,我们终于能通过isAlive()函数查看我们创建的线程了。

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

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

相关文章

Spark第一天

MapReduce过程复习 Spark由五部分组成 RDD五大特征 1、 Spark -- 代替MapReduce <<<<< scala是单机的&#xff0c;spark是分布式的。>>>>> 开源的分布式计算引擎 可以快速做计算 -- 因为可以利用内存来做一些计算 (1) 分为5个库(模块) : 1、…

C# 创建Windows服务,bat脚本服务注册启动删除

1、创建Windows服务&#xff0c;如下图。.NET Framework 4。Visual Studio 2019 。 2、在项目文件夹下创建文件夹LogConfig用于配置log4net&#xff0c;在LogConfig文件夹下新建log4net.config文件&#xff0c;如下图。 log4net.config文件内容如下。 <?xml version"…

能自动铲屎的自动猫砂盆是智商税吗?双十一热门自动猫砂盆推荐

大家平时一天要给猫咪铲几次屎呢&#xff1f;大多数应该都是早中晚各一次吧&#xff0c;在家的时候尚且能办到&#xff0c;但是一到了上班、出差、旅游的日子&#xff0c;我们又要如何保证猫咪的猫砂盆得到及时的清洁呢&#xff1f;要知道小猫咪的屎也很臭&#xff0c;猫砂盆长…

Linux云计算 |【第四阶段】RDBMS2-DAY4

主要内容&#xff1a; MHA概述、部署MHA集群 一、MHA概述 1、MHA简介 MHA&#xff08;Master High Availability&#xff09;是一款开源的MySQL的高可用程序&#xff0c;由日本DeNA公司youshimaton开发&#xff0c;是一套优秀的作为MySQL高可用性环境下故障切换和主从提升的…

Vue组件继承与扩展

Vue组件继承与扩展 前言 与Class继承类似&#xff0c;在Vue中可以通过组件继承来达到复用和扩展基础组件的目的&#xff0c;虽然它可能会带来一些额外的性能损耗和维护成本&#xff0c;但其在解决一些非常规问题时有奇效。本文将通过一些非常规的功能需求来讨论其实现过程。 …

广州自闭症寄宿学校有哪些?选择最适合孩子的学校

在广州这座繁华而充满人文关怀的城市里&#xff0c;有一群特殊的孩子&#xff0c;他们被称为“星星的孩子”——自闭症儿童。他们生活在自己的世界里&#xff0c;对外界的刺激反应迟钝或过度敏感&#xff0c;社交互动困难&#xff0c;语言表达受限。然而&#xff0c;在广州&…

高中数学基础

1.1函数的定义与性质 01函数定义 D是一个非&#xff0c;空时数集&#xff0c;对于D中的每一个X都有一个对应的规则f&#xff0c;能相应只对应唯一的一个实数Y&#xff0c;那么可以称Yf(X)&#xff0c;是一个函数。 判断是否为同一个函数&#xff0c;需要满足两个条件&#xff…

基于springboot和vue.js 养老院管理系统设计与实现

博主介绍&#xff1a;专注于Java&#xff08;springboot ssm springcloud等开发框架&#xff09; vue .net php phython node.js uniapp小程序 等诸多技术领域和毕业项目实战、企业信息化系统建设&#xff0c;从业十五余年开发设计教学工作 ☆☆☆ 精彩专栏推荐订阅☆☆☆…

LLM-RAG相关常见面试题

#############【持续更新】############## LLM-RAG相关常见面试题 1. RAG技术体系的总体思路 RAG可分为5个基本流程&#xff1a;知识文档的准备&#xff1b;嵌入模型&#xff08;embedding model&#xff09;&#xff1b;向量数据库&#xff1b;查询检索和生产回答。 参考&a…

山西省中小学生学籍照片手机拍照集中采集指南

随着山西省教育信息化的持续发展&#xff0c;学校管理的数字化转型中&#xff0c;学籍信息的精确记录变得尤为关键。在这一背景下&#xff0c;学籍管理系统的优化升级显得尤为重要。为了保障学生资料的精确无误&#xff0c;山西省对中小学生学籍系统中的照片采集和上传流程提出…

5本一投就中的极速期刊,性价比高,1周-1个月录用,见刊极快!

在当今快节奏的学术界&#xff0c;研究者们不仅追求高质量的研究成果&#xff0c;还希望能够迅速地将这些成果分享给全球的同行。为此&#xff0c;科检易学术精心挑选了10本以高效审稿流程著称的期刊&#xff0c;这些期刊不仅性价比高&#xff0c;而且从投稿到录用的时间极短&a…

使用API有效率地管理Dynadot域名,设置域名服务器(NS)的ip信息

前言 Dynadot是通过ICANN认证的域名注册商&#xff0c;自2002年成立以来&#xff0c;服务于全球108个国家和地区的客户&#xff0c;为数以万计的客户提供简洁&#xff0c;优惠&#xff0c;安全的域名注册以及管理服务。 Dynadot平台操作教程索引&#xff08;包括域名邮箱&…

决策树(descision tree)

一&#xff1a;决策树的基础介绍 决策树(descision tree)是一种基本的分类与回归的方法。决策树是一种对实例进行预测的树型结构。 下面是一个完整的二叉决策树&#xff0c;根据西瓜的几个特征判断西瓜的好坏。 纹理<1.5代表第一个判断条件&#xff0c;根据纹理<1.5是…

【JDK17 | 16】Java 17 深入剖析:密封类(二)

一、密封类的使用场景和优势 什么是密封类&#xff1f; 密封类&#xff08;sealed class&#xff09;是 Java 17 引入的一种新特性&#xff0c;允许开发者控制哪些类可以继承或实现某个类或接口。通过使用密封类&#xff0c;开发者可以定义一组特定的子类&#xff0c;从而提供…

【springboot9733】基于springboot+vue的藏区特产销售平台

作者主页&#xff1a;Java码库 主营内容&#xff1a;SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app等设计与开发。 收藏点赞不迷路 关注作者有好处 文末获取源码 项目描述 “互联网”的战略实施后&#xff0c;很多行业的信息化水…

好用的AI工具

目录 1.常用AI工具 1.1.语音助手 1.1.1. 华为小艺 1.1.2. 小米小爱同学 1.2.智能客服 1.2.1. 银行客服 1.2.2. 酒店语音电话 1.3.编程助手 1.3.1. 百度Comate 1.3.2. 华为CodeArts 2.创新AI应用 2.1. 生成式AI 2.2. 自动驾驶技术 2.3. 医疗AI 2.4. 智能客服机器…

简单的maven nexus私服学习

简单的maven nexus私服学习 1.需求 我们现在使用的maven私服是之前同事搭建的&#xff0c;是在公司的一台windows电脑上面&#xff0c;如果出问题会比较难搞&#xff0c;所以现在想将私服迁移到我们公司的测试服务器上&#xff0c;此处简单了解一下私服的一些配置记录一下&am…

conda新建环境中存在大量ros相关python包

1 问题现象 新建的conda环境&#xff0c;执行pip list&#xff0c;出现了大量的ros相关包&#xff0c;环境不纯净。重新安装anaconda没有用。 2 问题原因 2.1 执行python -m site 执行python -m site获得以下结果 其中sys.path包含了’/opt/ros/noetic/lib/python3/dist-…

想要项目顺利进行,企业如何做好节点计划管理?

项目的成功实施对于企业的发展和竞争力提升至关重要。然而&#xff0c;要确保项目顺利进行并非易事&#xff0c;其中做好节点计划管理是关键所在。一个精心策划和有效执行的节点计划&#xff0c;能够为项目的推进提供清晰的路线图&#xff0c;帮助企业合理分配资源、控制进度、…

VR虚拟场景:重塑沉浸式购物体验的新篇章

在科技日新月异的今天&#xff0c;虚拟现实&#xff08;VR&#xff09;技术正以前所未有的速度改变着我们的生活方式&#xff0c;特别是在消费领域&#xff0c;它正引领着一场前所未有的购物体验革命。通过构建高度逼真的虚拟场景&#xff0c;VR技术为消费者打造了一个超越现实…