【Java_EE】线程的属性和方法

2024-09-01 03:20
文章标签 java 线程 方法 属性 ee

本文主要是介绍【Java_EE】线程的属性和方法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

无论是自己定义的线程还是jvm内部创建的线程,核心在于制定一个任务给线程,让线程知道接下来要做什么任务。

制定任务的方式一般是:重写run/使用runnable/使用lambda...

这是上一节内容(线程的创建方法)

 

  关于线程属性的设置都要放在start之前设置,一旦线程已经启动,就没法再设置线程属性。(开弓没有回头箭)

1、isDaemon():是否为后台线程

区分前后台线程

前台线程:前台线程不结束,Java进程一定不结束;一个进程中的所有前台线程结束,进程才会结束。

后台线程(守护线程):后台线程继续执行,也不能阻止进程结束。

/***  关于线程属性的设置都要放在start之前设置,一旦线程已经启动,就没法再设置线程属性。(开弓没有回头箭)**  // 线程属性*     1、getId():获取id,此处的线程id是jvm自己弄得一套id体系和系统中pcb上的id是不同的。Java代码也无法获取到pcb中的id。*     2、getName():名称*     3、getState():状态*     4、getPriority():优先级*     5、isDaemon():是否为后台线程*                   前台线程:前台线程不结束,那么Java进程一定不会结束。一个进程中所有前台线程结束,进程才会结束。*                   后台线程(daemon):后台线程(守护线程)继续执行,也不能阻止Java进程结束。(在jconsole中看到的jvm中包含一些其他的内置线程,就属于后台线程)*                   gc(垃圾回收):是周期性持续性执行的线程,不可能主动结束,所以一般设置为后台线程。*                   gc线程和main线程同属于同一个进程中。进程结束,则所有线程结束。*     6、isAlive():是否存活*                  此处的属性:指的是系统中的线程(PCB)是否还存在。*                            Thread对象的生命周期 和 PCB的生命周期 是不一定一样的。*     7、isInterrupted():是否被终止*                        终止线程,在Java中都只是提醒建议,真正要不要终止需要线程本身来决定是否要终止。*/
public class thread_attribute {public static void main(String[] args) {// 使用lambda创建一个线程Thread thread = new Thread(()->{for (int i = 0; i < 3; i++) {System.out.println("前台线程:线程结束,进程结束");try {Thread.sleep(1000);} catch (InterruptedException e) {throw new RuntimeException(e);}}});thread.start();// 此时thread默认是前台线程,thread执行完才结束进程。Thread thread1 = new Thread(() -> {for (int i = 0; i < 5; i++) {System.out.println("设置为后台线程:无论线程是否结束,都无法阻止进程结束。进程结束,线程就强行结束。");try {Thread.sleep(1000);} catch (InterruptedException e) {throw new RuntimeException(e);}}});// 此处将线程设置为后台线程thread1.setDaemon(true);thread1.start();}
}

2、isInterrupted():是否被终止

终止线程:在Java中都只是提醒建议,是否要终止线程由当前程序员编写代码是否终止。

以下代码是自己写的一个控制终止线程,写这个段代码是遇到了一些问题!

自定义变量终止线程代码

/***  线程的核心操作*  1、start:执行start方法,才是真正将线程创建出来,并执行线程。*           每个线程都是独立调度执行的,相当于整个程序中多了一个执行流。*           一个Thread对象只能start一次。*  2、isInterrupted():是否被终止*                     终止线程,在Java中都只是提醒建议,真正要不要终止需要线程本身来决定是否要终止。*/
public class thread_method {private static boolean isRunning = true;/*** // 在声明isRunning这个变量是犯了一个错误,我将这个变量声明到了main方法中。**  main方法是一个静态方法,其作用范围仅限于方法内部,变量的作用范围仅限于局部变量,因此变量不能有访问控制修饰符。**  private:主要用于修饰类成员(字段/方法),因而private修饰符适用于类级别的字段和方法,而不适用于方法内部的局部变量。*  static:*        类级别变量:变量用static修饰,并且声明在类体内但方法外部,则变量属于类级别变量。所有实例共享同一个变量。*        局部变量:变量没有static修饰,则为局部变量,仅在方法的作用范围内有效。*/public static void main(String[] args) {// boolean isRunning = true;/*** // boolean isRunning = true;*  isRunning: 声明为局部变量,在此代码中是编译不了的。(这错误卡在了javac编译阶段,和jvm运行时没有关系)**             变量捕获:作为lambda或者匿名内部类,都能捕获到外面一层作用域中的变量名,就可以使用的。*             变量捕获:有一个前置条件,就是变量得是final或者“事实”final,这样才能被捕获的,否则就不能被捕获。**  isRunning此处不能报错,不能捕获的原因是:isRunning在下面被更改为了false,并不能“事实”final,所以不能被捕获。*                             解决方法:将下面isRunning的修改删除,此段代码就不会报错了。但是就达不到控制终止程序的效果。*/// 自己写一个控制终止线程Thread thread = new Thread(() -> {// 终止线程结束的方式有:控制循环条件、是否return...while(isRunning) {/*** 此处的isRunning是 内部类 访问 外部类的成员变量。*/System.out.println("线程任务");try {Thread.sleep(500);} catch (InterruptedException e) {throw new RuntimeException(e);}}System.out.println("线程已终止");});thread.start(); // 创建线程并执行线程try {Thread.sleep(5000); // 5秒后结束线程,那么就需要改变控制条件} catch (InterruptedException e) {throw new RuntimeException(e);}System.out.println("终止线程");isRunning = false;}
}

private、static修饰作为修饰符(上段代码中的问题一

private:主要用于修饰类成员(字段/方法),因而private修饰符适用于类级别的字段和方法,而不适用于方法内部的局部变量。
static:类级别变量:变量用static修饰,并且声明在类体内但方法外部,则变量属于类级别变量。所有实例共享同一个变量。局部变量:变量没有static修饰,则为局部变量,仅在方法的作用范围内有效。
main方法是一个静态方法,其作用范围仅限于方法内部,变量的作用范围仅限于局部变量,因此变量不能有访问控制修饰符。

变量捕获(上段代码中的问题二

 isRunning: 声明为局部变量,在此代码中是编译不了的。(这错误卡在了javac编译阶段,和jvm运行时没有关系)
变量捕获:作为lambda或者匿名内部类,都能捕获到外面一层作用域中的变量名,就可以使用的。
变量捕获:有一个前置条件,就是变量得是final或者“事实”final,这样才能被捕获的,否则就不能被捕获。
isRunning此处不能报错,不能捕获的原因是:isRunning在下面被更改为了false,并不能“事实”final,所以不能被捕获。
解决方法:将下面isRunning的修改删除,此段代码就不会报错了。但是就达不到控制终止程序的效果。

interrupt、isInterrupted方法终止线程代码

 

1、interrupt():不是唤醒方法,只是提醒线程终止。能够设置 线程内置的标志位boolean变量的值;除了能设置boolean值,还可以唤醒sleep等阻塞的方法;
2、isInterrupted(boolean): 线程内置的标志位boolean,true表示线程终止;false表示线程继续执行。
3、currentThread(): Thread类中的一个static方法,此方法是获取当前线程,能够获取到当前thread这个引用。

    在下面catch代码中有重要内容!!!

/***  Thread提供的interrupt()方法和isInterrupted()方法实现控制终止程序*  1、interrupt():不是唤醒方法,只是提醒线程终止。*                 能够设置 线程内置的标志位boolean变量的值;*                 除了能设置boolean值,还可以唤醒sleep等阻塞的方法;**/
public class thread_isInterrupted_method {public static void main(String[] args) {Thread thread = new Thread(() -> {while (!Thread.currentThread().isInterrupted()) {/***  currentThread(): Thread类中的一个static方法,此方法是获取当前线程,能够获取到当前thread这个引用。*  isInterrupted(boolean): 线程内置的标志位boolean,true表示线程终止;false表示线程继续执行。*/System.out.println("线程任务");try {Thread.sleep(500);} catch (InterruptedException e) {// throw new RuntimeException(e);e.printStackTrace();/*** // 打印异常信息后还能继续线程,线程并没有终止**    导致这个现象的原因是:*    上述代码中有sleep()方法,线程正在sleep时,*    触发了interrupt()方法,就导致sleep()方法被唤醒,*    唤醒的同时就会清除刚才改变的标志位(就又回到了false);*//***  是否要结束当前线程,看程序员如何写:*  1、不想结束当前线程:那么就不写退出循环的代码;*  2、想结束当前线程:break; // 就会直接结束当前线程*/}}System.out.println("线程已结束");});thread.start();try {Thread.sleep(3000);// 3秒后结束线程} catch (InterruptedException e) {throw new RuntimeException(e);}// 改变线程内置的标志位boolean值thread.interrupt();// 使用interrupt()后,要不要结束线程都是线程自身决定的}
}

这篇关于【Java_EE】线程的属性和方法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1125800

相关文章

Python中反转字符串的常见方法小结

《Python中反转字符串的常见方法小结》在Python中,字符串对象没有内置的反转方法,然而,在实际开发中,我们经常会遇到需要反转字符串的场景,比如处理回文字符串、文本加密等,因此,掌握如何在Pyt... 目录python中反转字符串的方法技术背景实现步骤1. 使用切片2. 使用 reversed() 函

一文详解SpringBoot中控制器的动态注册与卸载

《一文详解SpringBoot中控制器的动态注册与卸载》在项目开发中,通过动态注册和卸载控制器功能,可以根据业务场景和项目需要实现功能的动态增加、删除,提高系统的灵活性和可扩展性,下面我们就来看看Sp... 目录项目结构1. 创建 Spring Boot 启动类2. 创建一个测试控制器3. 创建动态控制器注

Python中将嵌套列表扁平化的多种实现方法

《Python中将嵌套列表扁平化的多种实现方法》在Python编程中,我们常常会遇到需要将嵌套列表(即列表中包含列表)转换为一个一维的扁平列表的需求,本文将给大家介绍了多种实现这一目标的方法,需要的朋... 目录python中将嵌套列表扁平化的方法技术背景实现步骤1. 使用嵌套列表推导式2. 使用itert

Java操作Word文档的全面指南

《Java操作Word文档的全面指南》在Java开发中,操作Word文档是常见的业务需求,广泛应用于合同生成、报表输出、通知发布、法律文书生成、病历模板填写等场景,本文将全面介绍Java操作Word文... 目录简介段落页头与页脚页码表格图片批注文本框目录图表简介Word编程最重要的类是org.apach

Python使用pip工具实现包自动更新的多种方法

《Python使用pip工具实现包自动更新的多种方法》本文深入探讨了使用Python的pip工具实现包自动更新的各种方法和技术,我们将从基础概念开始,逐步介绍手动更新方法、自动化脚本编写、结合CI/C... 目录1. 背景介绍1.1 目的和范围1.2 预期读者1.3 文档结构概述1.4 术语表1.4.1 核

在Linux中改变echo输出颜色的实现方法

《在Linux中改变echo输出颜色的实现方法》在Linux系统的命令行环境下,为了使输出信息更加清晰、突出,便于用户快速识别和区分不同类型的信息,常常需要改变echo命令的输出颜色,所以本文给大家介... 目python录在linux中改变echo输出颜色的方法技术背景实现步骤使用ANSI转义码使用tpu

Conda与Python venv虚拟环境的区别与使用方法详解

《Conda与Pythonvenv虚拟环境的区别与使用方法详解》随着Python社区的成长,虚拟环境的概念和技术也在不断发展,:本文主要介绍Conda与Pythonvenv虚拟环境的区别与使用... 目录前言一、Conda 与 python venv 的核心区别1. Conda 的特点2. Python v

Spring Boot中WebSocket常用使用方法详解

《SpringBoot中WebSocket常用使用方法详解》本文从WebSocket的基础概念出发,详细介绍了SpringBoot集成WebSocket的步骤,并重点讲解了常用的使用方法,包括简单消... 目录一、WebSocket基础概念1.1 什么是WebSocket1.2 WebSocket与HTTP

SpringBoot+Docker+Graylog 如何让错误自动报警

《SpringBoot+Docker+Graylog如何让错误自动报警》SpringBoot默认使用SLF4J与Logback,支持多日志级别和配置方式,可输出到控制台、文件及远程服务器,集成ELK... 目录01 Spring Boot 默认日志框架解析02 Spring Boot 日志级别详解03 Sp

java中反射Reflection的4个作用详解

《java中反射Reflection的4个作用详解》反射Reflection是Java等编程语言中的一个重要特性,它允许程序在运行时进行自我检查和对内部成员(如字段、方法、类等)的操作,本文将详细介绍... 目录作用1、在运行时判断任意一个对象所属的类作用2、在运行时构造任意一个类的对象作用3、在运行时判断