java线程池返回线程状态_Java线程的不同状态

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状态中的任何一个。 从理论上讲,如果线程不等待获取任何锁,或者不Hibernate,或者不调用任何使其等待的方法,则它仅完成执行并直接进入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

java线程池返回线程状态

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

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

相关文章

远程Linux主机安装Oh My Zsh

文章目录介绍安装安装后介绍 Oh My Zsh is an open source, community-driven framework for managing your Zsh configuration. 安装 如果你的服务器没有安装 zsh,则要先安装 zsh: yum install zsh要先安装 git: yum install git然后安…

处理Nginx返回octet-stream数据流的配置

解决 修改Nginx的配置将add_header Content-length 0;删除,处理 Content-Type为application/octet-stream 一、请求报文 二、异常信息 对应前端页面的异常信息为: Network Error epoll_wait() reported that client prematurely closed c…

multi task训练torch_Multi-task Learning的三个小知识

本文译自Deep Multi-Task Learning – 3 Lessons Learned by Zohar Komarovsky在过去几年里,Multi-Task Learning (MTL)广泛用于解决多个Taboola(公司名)的业务问题。在这些业务问题中, 人们使用一组相同的特征以及深度学习模型来…

java8多线程运行程序_线程,代码和数据–多线程Java程序实际运行的方式

java8多线程运行程序有些事情是您在学术或培训班上没有学到的,经过几年的工作经验后才逐渐了解,然后才意识到,这是非常基本的事情,我为什么错过了这么多年。 了解多线程Java程序的执行方式就是其中之一。 您肯定已经听说过线程&am…

zsh命令行界面/zsh终端界面粘贴卡顿的问题

因为安装了某些zsh插件导致,在zsh命令行中粘贴文本非常卡顿,解决方案就是把下面的代码复制到 ~/.zshrc 文件中: pasteinit() {OLD_SELF_INSERT${${(s.:.)widgets[self-insert]}[2,3]}zle -N self-insert url-quote-magic # I wonder if youd…

java连接mongodb的jar包_Java实战之管家婆记账系统(1)——项目简述

项目简述:该项目是一个通过JavaFX实现的管家婆记账系统,具有记账的功能。使用软件:IntelliJ IDEA 2018.3.5(Ultim ate Edition):编写Java项目代码。JavaFX Scene Builder 2.0:生成fxml界面文件。Navicat for MySQL&…

oauth2.0协议流程_正确的工作流程:我应该使用哪个OAuth 2.0流程?

oauth2.0协议流程什么是OAuth 2.0 OAuth 2.0是一个已被广泛采用的委托授权框架,已经存在了很多年,并且似乎已经存在。 如果您不熟悉OAuth 2.0的基本概念,可以使用 川崎孝彦写的优秀文章 。 这只是OAuth 2.0各方的简要提醒: 资源…

远程Linux主机安装zsh插件zsh-syntax-highlighting

安装说明: https://github.com/zsh-users/zsh-syntax-highlighting/blob/master/INSTALL.md 根据安装说明: 1.Clone this repository in oh-my-zsh’s plugins directory: git clone https://github.com/zsh-users/zsh-syntax-highlightin…

scare机器人如何手眼标定_基于视觉伺服的工业机器人系统研究(摄像机标定、手眼标定、目标单目定位)...

击上方“新机器视觉”,选择加"星标"或“置顶”重磅干货,第一时间送达标定技术常见的机器人视觉伺服中要实现像素坐标与实际坐标的转换,首先就要进行标定,对于实现视觉伺服控制,这里的标定不仅包括摄像机标定…

单元测试junit参数_使用Junit参数在更少的时间内编写更好的单元测试

单元测试junit参数大多数人都知道单元测试的重要性和好处,以及为什么要在进行的项目中使用它们。 而且,大多数人不喜欢在他们从事的项目中编写单元测试。 TDD的人当然处于另一面,但根据我的经验,他们在IT行业中是少数派。 说到我…

Linux CentOS安装zsh插件提示/usr/bin/env: python: No such file or directory。

执行 ./install.py 文件时,提示: /usr/bin/env: python: No such file or directory查看系统已安装的 python 版本: ➜ ~ ls -l /usr/bin | grep python lrwxrwxrwx 1 root root 36 11月 2 18:11 python -> /etc/alternativ…

3l如何使用_慢阻肺患者如何选购呼吸机和制氧机,需要注意哪些?

慢阻肺(COPD)是慢性阻塞性肺疾病的简称,进一步发展为肺心病和呼吸衰竭的常见慢性疾病。与有害气体及有害颗粒的异常炎症反应有关,致残率和病死率很高,全球大约有2.1亿人患有慢阻肺,中国大概约有4000-8000万人。慢阻肺已成为全球范…

apache ignite_通过示例获取Apache Ignite Baseline拓扑

apache ignite点燃基准拓扑或BLT代表群集中的一组服务器节点,这些服务器节点将数据持久存储在磁盘上。 其中,N1-2和N5服务器节点是具有本机持久性的Ignite集群的成员,该集群使数据能够持久存储在磁盘上。 N3-4和N6服务器节点是Ignite群集的…

自定义报错返回_MybatisPlus基础篇学习笔记(五)------自定义sql及分页查询

本章目录自定义sql分页查询1. 自定义sql在dao文件中编写自定义接口,并在方法上使用注解形式注入SQL,如图所示:第一种:第二种① application.yml加入下面配置mybatis-plus:mapper-locations: com/ethan/mapper/*② MemberMapper.ja…

精简jdk包_具有JDK 12精简数字格式的自定义精简数字模式

精简jdk包帖子“ 紧凑数字格式出现在JDK 12中 ”已经成为有关Java subreddit线程的讨论主题 。 在那个线程中表达的与紧凑数字格式表示有关的问题涉及显示的精度数字和显示的紧凑数字模式。 可以通过使用CompactNumberFormat.setMinimumFractionDigits(int)来解决精度数字问题&…

两个数相乘积一定比每个因数都大_人教版五年级数学:因数、倍数与分数的整理与复习...

写在前面的话:因数与倍数和分数基本性质之间存在紧密的联系,可以将之放在一起学习,对分数基本性质的学习有促进作用,分数的基本性质对分数的加法和减法也非常重要,因此可以放在一起学习、复习。【整理与复习】因数与倍…

Linux中在zsh下如何安装autojump

文章目录介绍安装介绍 autojump is a faster way to navigate your filesystem. It works by maintaining a database of the directories you use the most from the command line. Directories must be visited first before they can be jumped to. 关于 autojump 有以下几个…

fork join框架_Java中的Fork / Join框架的简要概述

fork join框架Fork / Join框架是使用并发分治法解决问题的框架。 引入它们是为了补充现有的并发API。 在介绍它们之前,现有的ExecutorService实现是运行异步任务的流行选择,但是当任务同质且独立时,它们会发挥最佳作用。 运行依赖的任务并使用…

3模型大小_Github推荐一个国内牛人开发的超轻量级通用人脸检测模型

Ultra-Light-Fast-Generic-Face-Detector-1MB1MB轻量级通用人脸检测模型作者表示该模型设计是为了边缘计算设备以及低功耗设备(如arm)设计的实时超轻量级通用人脸检测模型。它可以用于arm等低功耗计算设备,实现实时的通用场景人脸。检测推理同…

macOS如何使用命令启动服务/停止服务/查看服务

文章目录开启服务停止服务查看服务是否启动开启服务 使用命令开启 sshd 服务: $ sudo launchctl load -w /System/Library/LaunchDaemons/ssh.plist注:成功启动不会有任何输出 停止服务 $ sudo launchctl unload -w /System/Library/LaunchDaemons/s…