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 模型读取数据,将会导致线程阻塞,线程将会进入休眠,从而 ...
随机推荐
- 对接网易云信音视频2.0呼叫组件集成到vue中,实现web端呼叫app,视频语音通话。
项目中需要实现视频通话功能,经过公司的赛选,采用网易云信的视频通话服务,app小伙伴集成很顺利.web端需要实现呼叫app端用户.网易云信文档介绍不全,vue的demo满足不了需求,和客服人员沟通,只 ...
- [GDOI2021 Day2T1] 宝石
题目大意 \(n\)个点的树, 树上每一个点有一个宝石\(w_i\), 给出一个固定的数字不重复的序列\(p_i\)和一些询问\(u_i, v_i\), 对于每一个询问求出\(u_i\)到\(v_i\ ...
- CentOS 系统 查看 cpu核数
转载自 :Centos下查看cpu核数 - 韩憨 - 博客园 (cnblogs.com) 1.概念物理CPU:实际Server中插槽上的CPU个数.物理cpu数量:可以数不重复的 physical i ...
- yum是什么?repo文件详解,epel简介,yum源的更换,repo和epel区别
yum是什么?repo文件详解,epel简介,yum源的更换,repo和epel区别 简单概括: repo和epel的关系 repo是配置源的,即配置从哪里下载包(以及依赖关系)的. epel是作为桥 ...
- PaddleOCRSharp,2022年,你来的晚了些,一款.NET离线使用的高精度OCR
一款免费且离线的.NET使用的OCR,爱你又恨你!恨你来的太晚了. PaddleOCRSharp 本项目是一个基于百度飞桨的PaddleOCR的C++代码修改并封装的.NET的类库.包含文本识别.文本 ...
- [流畅的Python]第一章数据模型
这些来自同一家出版社的动物书 像是计算机科学界一盏盏指路明灯 余幼时 初试读 学浅 以为之晦涩难懂 像是老学究咬文嚼字 现在看起来还有些有趣 其实理工男大多都很有趣 这一章介绍了 怎么样去视线一个带有 ...
- 【刷题-LeetCode】211. Add and Search Word - Data structure design
Add and Search Word - Data structure design Design a data structure that supports the following two ...
- 【刷题-LeetCode】152 Maximum Product Subarray
Maximum Product Subarray Given an integer array nums, find the contiguous subarray within an array ( ...
- gin框架中设置信任代理IP并获取远程客户端IP
package main import ( "fmt" "github.com/gin-gonic/gin" ) func main() { gin.SetMo ...
- python 线程池使用
传统多线程方案会使用"即时创建, 即时销毁"的策略.尽管与创建进程相比,创建线程的时间已经大大的缩短,但是如果提交给线程的任务是执行时间较短,而且执行次数极其频繁,那么服务器将处于 ...