Java线程的不同状态

介绍

在Java中,线程可以具有状态。 Thread.State枚举定义Java线程可以具有的不同状态。 该枚举定义了以下值–

  1. 可运行
  2. 已封锁
  3. 等候
  4. TIMED_WAITING
  5. 已终止

在接下来的部分中,我将简要概述这些状态以及它们之间的可能过渡。

Java线程的状态

这是线程首次创建时所获得的默认状态。

可运行

线程一开始执行,便立即进入RUNNABLE状态。 请注意,等待获取CPU来执行的线程仍处于此状态。

已封锁

线程在等待监视器锁定时被阻塞,便立即进入BLOCKED状态。 这可以通过以下两种方式之一进行:

  1. 它正在等待获取锁定以输入同步的块/方法。
  2. 它正在等待重新获取对其调用Object.wait方法的对象的监视器锁定。

等候

线程由于调用以下方法之一而移至此状态–

  1. Object.wait没有超时
  2. Thread.join没有超时
  3. LockSupport.park

TIMED_WAITING

线程由于调用以下方法之一而移至此状态–

  1. 线程睡眠
  2. Object.wait超时
  3. Thread.join超时
  4. LockSupport.parkNanos
  5. LockSupport.parkUntil

已终止

线程终止后,它将立即移至该状态。

可能的状态转换

下图显示了不同状态之间可能的转换–

Java线程


安排执行线程后,它将立即进入RUNNABLE状态。 已经用第一个箭头(标记为1)显示了此过渡。

从RUNNABLE状态,线程可以移至BLOCKED,WAITING,TIMED_WAITING或TERMINATED状态中的任何一个。 从理论上讲,如果线程不等待获取任何锁,或者不休眠,或者不调用任何使其等待的方法,则它仅完成执行并直接进入TERMINATED状态(标记为2d)。

当然,在实际应用中,上述情况极不可能发生。 线程通常试图获取锁,在这种情况下,如果线程必须等待锁,则它会进入BLOCKED(标记为2a)状态。 线程还显式地等待某些先决条件为真/来自其他线程的操作,在这种情况下,线程将根据等待是否计时而移至WAITING(标记为2b)或TIMED_WAITING(标记为2c)状态。

一旦线程移至BLOCKED状态,接下来唯一允许的过渡就是移至RUNNABLE状态(标记为3d)。

同样,从等待状态的唯一可能转换是移动到已阻止状态(标记为3c)。

请注意,Internet上的某些文章错误地添加了从WAITING到RUNNABLE状态的过渡。 这只是不正确的。 线程永远不能直接从WAITING状态进入RUNNABLE状态。 我们可以通过一个例子来了解其原因。

假设我们有一个线程T,该线程当前处于RUNNABLE状态,并持有三个对象a,b和c的监视器锁定,如下图所示–

Java线程

此时,T调用c.wait(),此后它不再持有对象c的监视器锁定–

Java线程

使用调用notify / notifyAll通知T时,它立即停止等待并与其他线程(例如X和Y)竞争以获取c的监视器锁定–

Java线程


根据上面的定义,它是BLOCKED状态。 仅在获取了c的监视器锁定后,T才进入RUNNABLE状态。 可以对Thread.join()(内部使用Object.wait())和LockSupport.park()应用类似的推理。

让我们回到原始状态转换图。 如我们所见,线程可以从TIMED_WAITING状态移动到RUNNABLE(标记为3b)或BLOCKED(标记为3a)状态。 在这种情况下,可以转换为RUNNABLE,因为线程可以在调用Thread.sleep方法后进入TIMED_WAITING状态,在这种情况下,它保留当前持有的所有监视器锁定。

当线程在RUNNABLE,BLOCKED,WAITING或TIMED_WAITING状态之间来回移动后,完成执行时,它将一劳永逸地进入TERMINATED状态。

我们如何获得线程的当前状态?

我们可以使用Thread.getState()方法来检索线程的当前状态。 我们可以使用此值来监视或调试应用程序在生产中可能遇到的任何并发问题。

结论

在本文中,我们简要回顾了Java线程可以具有的不同状态,以及线程如何在这些状态之间移动。 与往常一样,任何反馈/改进建议/评论都将受到高度赞赏!

翻译自: https://www.javacodegeeks.com/2019/01/different-states-java-threads.html

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

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

相关文章

IDE日志分析方法pt。 2

介绍 在第一部分中,我解释了日志分析的理论方法,我认为这对维持工程师是最合适的。 这位工程师不需要在日志出现时立即对其进行分析,而是专注于对复杂问题的深入分析。 在第二部分中,我将展示一个复杂的模板可以涵盖许多搜索场景&…

java 面试指南_Java面试参考指南–第1部分

java 面试指南JAVA面向对象的概念 Java in基于面向对象的概念,它允许更高级别的抽象以实际方式解决任何问题。 面向对象的方法将实际对象中的问题解决方案概念化,更易于在整个应用程序中重用。 例如椅子,风扇,狗,电脑…

创建一个安全的Spring REST API

“我喜欢编写身份验证和授权代码。” 〜从来没有Java开发人员。 厌倦了一次又一次地建立相同的登录屏幕? 尝试使用Okta API进行托管身份验证,授权和多因素身份验证。 “如果有用,它将被修改。” 这些智慧之言来自我的QA老师,他们…

java并发编程十 原子累加器和Unsafe

文章目录 原子累加器cas 锁原理之伪共享 UnsafeUnsafe CAS 操作 原子累加器 累加器性能比较 private static <T> void demo(Supplier<T> adderSupplier, Consumer<T> action) {T adder adderSupplier.get();long start System.nanoTime();List<Thread…

具有ELK的APIGEE API网关日志管理(Elastic Search,Logstash和Kibana)

在本文中&#xff0c;我们将看到如何使用 Elastic Search &#xff0c; Logstash 和 Kibana 管理APIGEE API网关生成的日志 。 下图突出显示了日志数据如何流经ELK堆栈以进行数据可视化和监视。 作为API网关的一部分&#xff0c;我们将使用MessageLogging策略在代理流&#xf…

java 80_【JavaWeb】80:js基础详解

今天是刘小爱自学Java的第80天。感谢你的观看&#xff0c;谢谢你。话不多说&#xff0c;开始今天的学习&#xff1a;JavaScript是一门编程语言&#xff0c;但凡是编程语言&#xff0c;其在基本语法上都是大同小异的。我们学了Java&#xff0c;那么再学习其它语言时&#xff0c;…

php manager iis 8,PHPManager2下载

PHP Manager 2.x 理论支持win10,win8,win7,Windows Server2008,Windows Server2012,Windows Server2012R2,Windows Server2016,,Windows Server2019与其对应的IIS版本.--PHP Manager 2.4 for IIS10,IIS8,IIS7 下载简单但功能强大具有独特功能的工具&#xff0c;可以处理所有细节…

企业知识库:从信息管理到知识创新的转变

在当今这个信息爆炸的时代&#xff0c;企业知识库的建设已经成为了企业持续发展的重要基石。从传统的信息管理到现代的知识创新&#xff0c;企业知识库的角色和功能也在不断地演变和升级。本文将探讨企业知识库的发展历程&#xff0c;以及如何实现从信息管理到知识创新的转变。…

php封装的数据库操作文件夹,PHP中对数据库操作的封装_php

现在我们把其封装在dbfz.inc中&#xff0c;其设计如下&#xff1a;$#60;?class dbInterface{ var $dbID1; //用于确定当前操作的数据库&#xff0c;当dbID为1代表mysql,当为 2代表 SQL Server&#xff0c;为3时为ODBC或其它。var $dbHost; //数据库所在主机域名var $dbUsernam…

Spring框架架构

这是Spring Framework Architecture的概述。 了解Spring Framework的各个组成部分如何组织以及如何相互联系。 如果您想了解什么是Spring框架及其功能&#xff0c;请阅读Spring框架简介 。 总览 Spring是一个模块化框架 。 它不是作为一个软件包或多个模块捆绑在一起的。 各种…

php中n12br,PHP常见字符串操作函数与用法总结

一、字符串的格式化1、字符串的格式化trim()函数可以去除字符串的开始位置和结束位置的空格&#xff0c;并将结果字符串返回&#xff0c;默认情况下去除的字符是换行符和回车符(\n和\r),水平和垂直制表符(\t和X0B)ltrim()函数只从字符的开始处(左边)去除空格rtrim()函数只从函数…

面向切面编程应用_应用面向方面的编程

面向切面编程应用1.引言 面向方面编程的主要目标是将跨领域关注点分离。 当我们谈论跨领域的关注时&#xff0c;我们指的是在我们的系统或应用程序中的多个地方使用的通用功能。 这些概念包括&#xff1a; 记录中 交易管理 错误处理 监控方式 安全 实现这种分离的方法是将…

centos 安装php扩展gd,linux(centos)下为php添加添加GD扩展

yum -y install libjpeglibjpeg-devel libpng libpng-devel freetype freetype-devel 安装依赖库yum -y install libjpeg-devel1.首先切换到php源码目录&#xff1a;/usr/local/php-5.6.29/ext/gd2.利用phpize生成gd扩展文件,/usr/local/php/bin/mipsel-linux-phpize, ls 或者 …

弹簧启动执行器教程

朋友您好&#xff0c;在本教程中&#xff0c;我们将学习弹簧执行器及其所有功能。 1.什么是弹簧执行器&#xff1f; 2.如何在Maven项目或Gradle项目中添加弹簧执行器&#xff1f; 3.创建一个具有Spring Actuator依赖项的Spring Boot项目。 4.使用弹簧执行器端点监视应用程序…

php xls 邮件,PHPMailer发送邮件

PHPMailer是一个封装好的PHP邮件发送类&#xff0c;支持发送HTML内容的电子邮件&#xff0c;以及图片附件&#xff0c;前提要设置好邮件服务器就能实现邮件发送功能。HTML首先我们先放置一个收件箱的输入框和一个发送邮件按钮&#xff1a;收件人&#xff1a;jQuery$(function()…

引导性GCP:带有Google Cloud Pub / Sub的Spring Cloud Stream

我最近在Sprint Central的工程博客上阅读了Josh Long的Bootiful GCP系列 &#xff0c;特别喜欢关于使用Google Cloud的Pub / Sub的第四部分 。 我受到该系列的启发&#xff0c;同时我还在为我的一个新项目评估Spring Cloud Stream。 我以为&#xff0c;我会继续讨论乔希&#x…

jdbc和jdbc驱动_JDBC布尔兼容性列表

jdbc和jdbc驱动有趣的是&#xff0c;布尔类型只是在SQL标准后期才引入&#xff0c;即SQL&#xff1a;1999 。 即使在今天&#xff0c;并非所有数据库本身都支持BOOLEAN或BIT类型。 最重要的是&#xff0c;我们仍然可以在Oracle中等待一段时间。 这是2002年以来关于该主题的“问…

IDE日志分析方法pt。 1个

介绍 我认为大多数软件工程师都了解日志的重要性。 它们已成为软件开发的一部分。 如果无法解决问题&#xff0c;我们尝试在日志中查找原因。 对于一些简单的情况&#xff0c;当错误阻止应用程序打开窗口时&#xff0c;这可能就足够了。 您可以在日志中找到问题&#xff0c;然后…

java运行构建期间出错_构建和运行Java 8支持

java运行构建期间出错尚未提供对Java 8的Eclipse支持。 如果要使用它&#xff0c;则必须构建它。 Eclipsepedia的JDT Core / Java8页面包含有关使用Eclipse Java开发工具 &#xff08;JDT&#xff09;中不断发展的Java 8支持源来设置开发环境的说明。 说明中缺少一些内容&#…

从Commons CLI迁移到picocli

最初于2002年发布的Apache Commons CLI可能是使用最广泛的Java命令行解析器&#xff0c;但是它的API显示了它的年龄。 寻找具有最少样板代码的现代方法的应用可能对picocli感兴趣。 为什么要花麻烦的钱进行迁移&#xff0c;以及如何将基于Commons CLI的应用程序迁移到picocli&a…