Java线程状态介绍
原创:转载需注明原创地址 https://www.cnblogs.com/fanerwei222/p/11867086.html
Java 线程状态介绍:
Java官方文档中对Java线程的几种状态做了说明, 说明如下;
public static enum Thread.State
extends Enum<Thread.State> A thread state. A thread can be in one of the following states: NEW
A thread that has not yet started is in this state.
RUNNABLE
A thread executing in the Java virtual machine is in this state.
BLOCKED
A thread that is blocked waiting for a monitor lock is in this state.
WAITING
A thread that is waiting indefinitely for another thread to perform a particular action is in this state.
TIMED_WAITING
A thread that is waiting for another thread to perform an action for up to a specified waiting time is in this state.
TERMINATED
A thread that has exited is in this state. A thread can be in only one state at a given point in time. These states are virtual machine states which do not reflect any operating system thread states.
以这个文档来进行一点说明:
Java 线程共有6个状态:
新建(NEW)
可运行(RUNNABLE)
阻塞(BLOCKED)
等待(WAITING)
超时等待(TIMED_WAITING)
终止(TERMINATED)
各个状态的生成时机和介绍:
1. 新建(NEW)
new Thread() --> 新建
2. 可运行(RUNNABLE)
2.1 就绪
Thread.start() --> 开始线程 --> 到达可运行仓库的门口排队就绪
Object.notify() --> 从等待/超时等待状态回到就绪队列
Object.notifyAll() --> 从等待/超时等待状态回到就绪队列
LockSupport.unpark(Thread) --> 从等待/超时等待状态回到就绪队列
Thread.yield() --> 从运行状态回到就绪队列
获取到 synchronized(Object)块/方法 中的对象锁 --> 从阻塞状态回到就绪队列 2.2 运行
就绪中的线程等待系统调度(得到CPU)成功之后 --> 开始运行 --> 运行中(占用CPU, 占用锁)
3. 阻塞(BLOCKED)
等待获取 synchronized(Object)块/方法 中的对象锁时 --> 阻塞
Thread.sleep(long timeout) --> 从运行状态进入阻塞状态(释放CPU, 占用锁)
4. 等待(WAITING)
Object.wait() --> 从运行状态进入等待状态(释放CPU, 释放锁)
Thread.join() --> 从运行状态进入等待状态
LockSupport.park() --> 从运行状态进入等待状态
5. 超时等待(TIMED_WAITING)
Object.wait(long timeout) --> 从运行状态进入超时等待状态(释放CPU, 释放锁)
Thread.sleep(long timeout) --> 从运行状态进入超时等待状态(释放CPU, 占用锁)
Thread.join(long timeout) --> 从运行状态进入超时等待状态
LockSupport.parkNanos(long timeout) --> 从运行状态进入超时等待状态
LockSupport.parkUntil(long timeout) --> 从运行状态进入超时等待状态
6. 终止(TERMINATED)
Thread.run()执行完毕之后 --> 终止
线程中断说明: interrupt()
线程在等待状态或者阻塞状态, 调用了线程的 interrupt() 方法, 会有以下3个过程:
1. 中断标记会立刻被标记为 true;
2. 随后由于是阻塞状态, 中断标记 true 会被清除 --> 所以又变成了false;
3. 最后抛出 InterruptedException 异常.
Java线程状态介绍的更多相关文章
- Java线程状态切换以及核心方法
1.Java线程状态 1.1 线程主要状态 ①初始(NEW):新创建了一个线程对象,但还没有调用start()方法.②运行(RUNNABLE):Java线程中将就绪(ready)和运行中(runnin ...
- Java线程状态、线程start方法源码、多线程、Java线程池、如何停止一个线程
下面将依次介绍: 1. 线程状态.Java线程状态和线程池状态 2. start方法源码 3. 什么是线程池? 4. 线程池的工作原理和使用线程池的好处 5. ThreadPoolExecutor中的 ...
- JVM探秘:jstack查看Java线程状态
本系列笔记主要基于<深入理解Java虚拟机:JVM高级特性与最佳实践 第2版>,是这本书的读书笔记. jstack命令可以打印Java进程的各个线程堆栈跟踪信息,可以用来查看Java中各个 ...
- C#通过接口与线程通信(捕获线程状态)介绍
C#通过接口与线程通信(捕获线程状态)介绍 摘要:本文介绍C#通过接口与线程通信(捕获线程状态),并提供简单的示例代码供参考. 提示:本文所提到的线程状态变化,并不是指线程启动.暂停.停止,而是说线程 ...
- Java线程状态Jstack线程状态BLOCKED/TIMED_WAITING/WAITING解释
一.线程5种状态 新建状态(New) 新创建了一个线程对象. 就绪状态(Runnable) 线程对象创建后,其他线程调用了该对象的start()方法.该状态的线程位于可运行线程池中,变得可运行,等待获 ...
- Java线程状态转换
前言:对于Java线程状态方面的知识点,笔者总感觉朦朦胧胧,趁着最近整理资料,将Java线程状态方面的知识点总结归纳,以便加深记忆. 1.Java线程状态值 在Thread类源码中通过枚举为线程定义了 ...
- Java线程状态及 wait、sleep、join、interrupt、yield等的区别
Java中的线程状态(详见Java线程状态及转换-MarchOn): wait:Object类的实例方法,释放CPU执行权,进入等待状态,直到 被中断.被拥有该对象锁的线程唤醒(notify或not ...
- 从源码看java线程状态
关于java线程状态,网上查资料很混乱,有的说5种状态,有的说6种状态,初学者搞不清楚这个线程状态到底是怎么样的,今天我讲一下如何看源码去解决这个疑惑. 直接上代码: public class Thr ...
- 面试官:都说阻塞 I/O 模型将会使线程休眠,为什么 Java 线程状态却是 RUNNABLE?
摘要: 原创出处 https://studyidea.cn 「公众号:程序通事 」欢迎关注和转载,保留摘要,谢谢! 使用 Java 阻塞 I/O 模型读取数据,将会导致线程阻塞,线程将会进入休眠,从而 ...
随机推荐
- Eclipse 常用快捷键大全
15 个 Eclipse 常用开发快捷键使用技巧 1.alt+? 或 alt+/:自动补全代码或者提示代码 2.ctrl+o:快速outline视图 3.ctrl+shift+r:打开资源列表 4.c ...
- Android studio 报错 Unable to resolve dependency for ‘:app@releaseUnitTest/compileClasspath‘:
出现报错: Unable to resolve dependency for ':app@debugAndroidTest/compileClasspath': Could not find any ...
- 编写Java程序,创建一个父类交通工具类(Vehicles),以及两个子类,分别是轿车类(Car)和卡车类(Truck)。
返回本章节 返回作业目录 需求说明: 创建一个父类交通工具类(Vehicles),以及两个子类,分别是轿车类(Car)和卡车类(Truck). 父类有属性品牌(brand)和颜色(color). 在父 ...
- 使用 Eclipse 可视化插件 windowbuilder 进行Java GUI开发(插件安装的两种方法)
对于Java GUI开发 其实最方便的方法是用插件制作,当然先了解完代码原理是最好的. eclispe安装windowbuilder有两种方式,一种是离线安装,一种是在线安装. 一.第一种在线安装: ...
- Java支持IPv6研究
1.Java对IPv6的支持 相对其他开发语言而言,Java对IPv6的支持是比较透明的, 如果全部采用域名(主机名)的方式进行通信,那么基本不需要修改也无需编译原来的代码就可以直接在IPv6上运行. ...
- python 面向对象:多态和多态性
很多人喜欢将多态与多态性二者混为一谈,然后百思不得其解,其实只要分开看,就会很明朗. 一.多态 多态指的是一类事物有多种形态.(一个抽象类有多个子类,因而多态的概念依赖于继承) 比如动物有多种形态:人 ...
- Django_静态资源配置和ajax(九)
一.静态资源配置 静态资源的相关配置都在项目目录下的 settings.py 文件中进行配置.配置参数如下: # 浏览器访问静态资源时的路径 STATIC_URL = '/static2/' # 存放 ...
- Linux上天之路(六)之Linux文件管理
文件与文件夹的操作 1) 新建 2)改名 3)查看 4)删除 5)拷贝 6)移动 1. 文件的操作 文件的新建:touch filename 文件的改名:mv 文件的查看:ls 文件内容的查看:cat ...
- 微信小程序封装mixins方法
在app.js中这样引入 import '@src/utils/mixins' mixins函数如下 /** * 封装类似vue的混入功能 */ let native = Page Page = (o ...
- 使用.NET 6开发TodoList应用(30)——实现Docker打包和部署
系列导航及源代码 使用.NET 6开发TodoList应用文章索引 需求 .NET 6 Web API应用使用最多的场景是作为后端微服务应用,在实际的项目中,我们一般都是通过将应用程序打包成docke ...