【JavaEE】Thread的方法和属性

文章目录

  • 1、Thread的常见构造方法
  • 2、Thread的几个常见属性
    • 2.1 ID
    • 2.2 名称
    • 2.3 状态
    • 2.4 优先级
    • 2.5 是否后台线程
    • 2.6 是否存活
    • 2.7 是否被中断
  • 3.补充说明
    • 3.1 Thread.sleep()的作用
    • 3.2 Thread.sleep()的异常处理方式


1、Thread的常见构造方法

方法说明
Thread()创建线程对象
Thread(Runnable target)使用Runnable对象创建线程对象
Thread(String name)创建线程对象,并命名
Thread(Runnable target, String name)使用Runnable对象创建线程对象,并命名
Thread(ThreadGroup, Runnable target)线程可以被用来分组管理,分好组即可

前面两个构造方法我们在线程的概念这篇中已经讲过了,这里就不在过多赘述
创建线程对象,并命名和使用Runnable对象创建对象,并命名
举例:

public class Test6 {public static void main(String[] args) {Thread thread = new Thread(()->{while (true) {System.out.println("hello");               }},"自定义线程");thread.start();        }
}

这里我们也可以通过jconsole.exe这个应用程序来观察到
在这里插入图片描述
注意:这么没有看到main线程不是main线程没有被创建,而是执行太快,已经执行完毕了
最后一个构造方法,在开发中很少用到,这里不再过多讨论

2、Thread的几个常见属性

属性获取方法
IDgetId()
名称getName()
状态getState()
优先级getPriority()
是否后台线程isDaemon()
是否存活isAlive()
是否被中断isInterrupted()

2.1 ID

ID是线程的唯一标识,不同线程不会重复,这里的ID和系统中PCB上的ID是不同的

2.2 名称

名称是各种调试工具用到

2.3 状态

状态表示线程当前所处的一个情况,后续会再次说明

2.4 优先级

优先级高的线程理论上来说更容易被调度

2.5 是否后台线程

线程有前台线程和后台线程
前台线程:这样的线程如果不运行结束,Java进程是一定不会结束的
前台线程可以有多个,多个前台线程,必须最后一个前台线程结束,进程才可以结束
后台线程:这样的线程,即使继续执行,也不能阻止Java进程结束

在Java代码中,main线程是前台线程,程序员创建出来的线程在默认情况下都是前台线程,我们可以通过setDaemon方法把线程设置为后台线程
举例:

public class Test7 {public static void main(String[] args) {Thread thread = new Thread(()->{for (int i = 0; i < 5; i++) {System.out.println("hello thread");                }});//设置为后台线程thread.setDaemon(true);thread.start();}
}

运行结果:
在这里插入图片描述
此时,进程中只有main是前台线程,只要main结束,整个进程就结束了,main执行完start立即结束
此时thread还没来得及打印,进程就结束了,里面的线程也就结束了

注意:这里也有一定的概率,出现thread打印一次,然后结束进程的情况,这个就要看main先执行结束,还是thread先执行一次打印(线程之间是抢占式执行,调度顺序不确定)
判断是否为后台线程:

public class Test7 {public static void main(String[] args) {Thread thread = new Thread(()->{for (int i = 0; i < 5; i++) {System.out.println("hello thread");                }});//设置为后台线程thread.setDaemon(true);thread.start();//是后台线程返回true,不是返回falseSystem.out.println(thread.isDaemon());}
}

运行结果:
在这里插入图片描述

2.6 是否存活

指的是系统中的线程(PCB)是否存在
Thread对象的生命周期和PCB的生命周期是不一定完全一样的
举例:

public class Test8 {public static void main(String[] args) throws InterruptedException {Thread thread = new Thread(()->{System.out.println("hello thread");           });//如果PCB存活返回true,不存活返回false       System.out.println(thread.isAlive());}
}

运行结果:
在这里插入图片描述
只有调用thread.start()方法后,才会创建线程,PCB才会在内核中创建出来
代码如下:

public class Test8 {public static void main(String[] args) throws InterruptedException {Thread thread = new Thread(()->{System.out.println("hello thread");           });thread.start();System.out.println(thread.isAlive());}
}

在这里插入图片描述

2.7 是否被中断

在Java中,我们可以通过调用Thread类的interrupt()方法来终止线程,这会向线程发送一个中断信号,线程可以通过检查isInterrupted()方法来响应中断并做出相应的处理,通常是安全的终止线程的执行
举例:

public class Test11 {public static void main(String[] args) {Thread thread = new Thread(()->{//currentThread()这是一个static方法,能获取到当前线程,获取到thread这个引用//isInterrupte()线程内置的标志位 boolean变量 true表示线程终止 false表示线程继续执行while(!Thread.currentThread().isInterrupted()) {System.out.println("hello thread");try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();                    }}});thread.start();try {Thread.sleep(3000);} catch (InterruptedException e) {throw new RuntimeException(e);}//中断thread线程thread.interrupt();}
}

运行结果:
在这里插入图片描述
注意这里,即使将thread线程中断了,但是循环还在继续执行,这个是为什么?
thread.interrupt();这段代码干了两件事:
1.将Thread.currentThread().isInterrupted()的布尔值改变为true
2.立即唤醒sleep(),不在等待

sleep()被唤醒的同时,就会清除刚才的标志位(又改回false),从而导致代码中的循环继续执行,同时catch()方法中的代码也会执行

之所以要改回来就是把控制权交给程序员,让程序员自己在catch()方法中设置,假如要中断thread线程,只需要在catch()方法中写break;就可以中断循环,使thread线程结束

3.补充说明

3.1 Thread.sleep()的作用

sleep()这个方法指睡眠/休眠,就是让线程主动进入“阻塞状态”(PCB上的状态属性),主动放弃去cpu上执行,时间到了,就会解除阻塞状态重新被调度到cpu上执行

3.2 Thread.sleep()的异常处理方式

**在main方法中处理sleep异常的方式有两种:
1.throws **

public class Test {public static void main(String[] args) throws InterruptedException {Thread.sleep(1000);}
}

2.try catch

public class Test {public static void main(String[] args) {try {Thread.sleep(1000);} catch (InterruptedException e) {throw new RuntimeException(e);}}
}

如果是在线程的run方法中只能用:try catch

public class Test {public static void main(String[] args) {Thread thread = new Thread(()-> {System.out.println("hello thread");try {Thread.sleep(1000);} catch (InterruptedException e) {throw new RuntimeException(e);}});}
}

这是因为throws也是方法签名的一部分,在run方法重写的时候,就要求方法的签名要一样
method sign ature包含:1.方法的名字
2.方法的参数列表(包含了类型和个数)
3.声明抛出的异常

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

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

相关文章

10G MAC层设计系列-(2)MAC RX模块

一、概述 MAC RX模块的需要进行解码、对齐、CRC校验。 因为在空闲的时候10G PCS/PMA会一直向外吐空闲符&#xff08;x07&#xff09;所以需要根据开始符、结束符将有效数据从码流中截取&#xff0c;也就是解码。 因为开始字符的所在位置有两种形式&#xff0c;而结束字符的位…

白盒测试与黑盒测试区别和联系

一、概念辨析 白盒测试 黑盒测试 二、其他测试方法 三、相关练习

算法训练营第十三天 | LeetCode 239 滑动窗口最大值、LeetCode 347 前K个高频元素

LeetCode 239 滑动窗口最大值 本体初始思路是这样的&#xff0c;首先看下给定数组长度和维持一个滑动窗口所需要花费的时间复杂度之间的关系。初步判断是还行的&#xff0c;当然后面被样例打脸了。需要更新成优先队列的解法。原本的解法能通过37/51和46/51的测试用例。但这还不…

正点原子[第二期]Linux之ARM(MX6U)裸机篇学习笔记-6.5--I.MX6U启动方式

前言&#xff1a; 本文是根据哔哩哔哩网站上“正点原子[第二期]Linux之ARM&#xff08;MX6U&#xff09;裸机篇”视频的学习笔记&#xff0c;在这里会记录下正点原子 I.MX6ULL 开发板的配套视频教程所作的实验和学习笔记内容。本文大量引用了正点原子教学视频和链接中的内容。…

导航系统架构及业务模块组合策略导读

系列文章目录 提示&#xff1a;这里可以添加系列文章的所有文章的目录&#xff0c;目录需要自己手动添加 TODO:写完再整理 文章目录 系列文章目录前言一、嵌入式硬件系统架构【开发系统平台架构】通讯方式及组件选型方向导航机器人硬件配置及其常用功能 二、嵌入式软件系统组件…

VS Code工具将json数据格式化

诉求&#xff1a;json数据格式化应该在工作中用到的地方特别多&#xff0c;为了更方便、更仔细的对json数据查看&#xff0c;将json数据格式化是非常有必要的。 VS Code中如何将json数据快速格式化 1、在VS Code中安装Beautify JSON插件 2、安装完后在需要格式化的文件中按住…

Web APIs 学习归纳6--- BOM浏览器对象

前面几节主要针对DOM进行了学习&#xff0c;现在开始新的内容的学习---DOM浏览器对象。 DOM是更注重页面&#xff08;document&#xff09;内容的设计&#xff0c;但是BOM不仅限于页面&#xff08;document&#xff09;的设计&#xff0c;而是更加全面包括页面的刷新&#xff0…

【linux学习指南】linux指令与实践文件编写

文章目录 &#x1f4dd;前言&#x1f320; linux目录结构&#x1f309;linux命令介绍 &#x1f320;pwd命令&#x1f309;mkdir指令&#xff08;重要&#xff09; &#x1f320;cd 指令&#x1f309;touch指令 &#x1f320;rmdir指令 && rm 指令&#xff08;重要&…

抖音评论区精准获客自动化获客释放双手

挺好用的&#xff0c;评论区自动化快速获客&#xff0c;如果手动点引流涨&#xff0c;那就很耗费时间了&#xff0c;不是吗&#xff1f; 网盘自动获取 链接&#xff1a;https://pan.baidu.com/s/1lpzKPim76qettahxvxtjaQ?pwd0b8x 提取码&#xff1a;0b8x

Dashboard 安装部署

Dashboard 安装部署 Dashboard 安装部署 一&#xff1a;下载 二&#xff1a;部署步骤 1.镜像下载及导入 国内直接拉外网镜像会失败&#xff0c;可在境外下载镜像 查看 deployment 里的镜像版本 Dashboard Deploymentcontainers:- name: kubernetes-dashboardimage: k8s.g…

C++中的指针详解

C中的指针详解 在C编程中&#xff0c;指针是一个非常重要且基础的概念。它允许程序员直接访问和操作内存地址&#xff0c;为高级数据结构和算法的实现提供了基础。本文将详细讲解C中指针的概念、用法和注意事项&#xff0c;帮助读者深入理解并掌握指针的相关知识。 一、指针的…

C++ 多线程中捕捉异常

有一个主线程&#xff0c;有一个子线程。主线程中调用子线程&#xff0c;并检查是否抛出异常&#xff0c;如果异常就处理异常信息。 主要思路&#xff1a;定义一个全局的std::exception_ptr对象&#xff0c;子线程抛异常时赋给该指针&#xff0c;主线程中检查该对象&#xff0…

四. Django项目之电商购物商城 -- 图片验证码生成

Django项目之电商购物商城 – 图片验证码生成 需要开发文档和前端资料的可私聊 一. 图片验证码的生成 1. 创建应用用于生成图片验证码 , 以及短信验证码 python manage.py startapp verfications2.配置radis数据库 "var_code":{# 配置数据库指定引擎"BACKE…

访问网站提示502 Bad Gateway的原因和解决方法

"502 Bad Gateway"错误通常表示服务器作为网关或代理服务器尝试访问上游服务器(如应用服务器或其他代理服务器)&#xff0c;但未能从上游服务器接收到有效的响应。以下是可能导致此错误的一些常见原因以及相应的解决方法&#xff1a; 1. 服务器端问题&#xff1a; 服…

Unity Audio Filter 入门

概述&#xff1a; 如果你在你项目中需要一些特殊的声音效果&#xff0c;那这部分声音过滤器的部分一定不要错过喔&#xff0c;让我们来学习这部分的内容吧&#xff01; 这部分理论性比较强&#xff0c;认真看我的注解哈&#xff0c;我尽量解释的易懂一点。 Audio Chorus Filter…

Intelij Idea Push失败,出现git Authentication failed(验证失败)

目录 1、出现问题的原因 2、解决之法 1、出现问题的原因 能出现这种问题&#xff0c;最主要的原因是链接对上了&#xff0c;但用户验证失败了&#xff0c;即登录失败。 因为服务器转移或者换了git项目链接&#xff0c;导致你忘记了用户名密码&#xff0c;随意输入之后&…

持续更新|UNIAPP适配APP遇到的问题以及解决方案

在使用UNIAPP开发APP的时候遇到的一些奇奇怪怪问题记录 组件样式丢失 问题&#xff1a;组件引入界面中&#xff0c;在小程序和H5环境下样式正常&#xff0c;而在APP中却出现高度异常问题 解决&#xff1a;增加view标签将组件包裹起来即可正常显示 解决前&#xff1a; 解决后…

数据结构:实验七:数据查找

一、 实验目的 &#xff08;1&#xff09;领会各种查找算法的过程和算法设计。 &#xff08;2&#xff09;掌握查找算法解决实际问题。 二、 实验要求 &#xff08;1&#xff09;编写一个程序exp8-1.cpp, 按提示输入10个任意的整形数据&#xff08;无序&#xff09;&…

socat移植到arm+linux

socat是一个用于建立双向数据流传输的工具&#xff0c;它可以在不同的网络层上创建连接&#xff0c;并支持多种协议&#xff0c;如TCP、UDP、SSL等。它非常强大且易于使用&#xff0c;因此广泛用于网络开发和系统管理中&#xff0c;这里记录一下移植到嵌入式系统的过程。 下载s…

每天学习一个Linux命令之sed

每天学习一个Linux命令之sed 欢迎来到我的博客系列&#xff0c;今天我们将学习一个非常强大的Linux命令——sed&#xff0c;它可以在文本处理中实现各种强大的操作。sed&#xff08;Stream Editor&#xff09;是Linux环境下的一种流编辑器&#xff0c;可以对文件内容进行替换、…