1
0
mirror of https://github.com/Snailclimb/JavaGuide synced 2025-06-16 18:10:13 +08:00

Update 线程有哪些状态?

This commit is contained in:
Snailclimb 2019-03-07 13:20:43 +08:00
parent 8e6c79940e
commit 7368e2f7c4

View File

@ -370,16 +370,26 @@ hashCode() 的作用是获取哈希码,也称为散列码;它实际上是返
## 30. 线程有哪些基本状态?
参考《Java 并发编程艺术》4.1.4节。
Java 线程在运行的生命周期中的指定时刻只可能处于下面6种不同状态的其中一个状态。
Java 线程在运行的生命周期中的指定时刻只可能处于下面6种不同状态的其中一个状态图源《Java 并发编程艺术》4.1.4节)。
![Java线程的状态](https://my-blog-to-use.oss-cn-beijing.aliyuncs.com/19-1-29/Java%E7%BA%BF%E7%A8%8B%E7%9A%84%E7%8A%B6%E6%80%81.png)
线程在生命周期中并不是固定处于某一个状态而是随着代码的执行在不同状态之间切换。Java 线程状态变迁如下图所示:
线程在生命周期中并不是固定处于某一个状态而是随着代码的执行在不同状态之间切换。Java 线程状态变迁如下图所示图源《Java 并发编程艺术》4.1.4节)
![Java线程状态变迁](https://my-blog-to-use.oss-cn-beijing.aliyuncs.com/19-1-29/Java%20%E7%BA%BF%E7%A8%8B%E7%8A%B6%E6%80%81%E5%8F%98%E8%BF%81.png)
由上图可以看出:
线程创建之后它将处于 **NEW新建** 状态,调用 `start()` 方法后开始运行,线程这时候处于 **READY可运行** 状态。可运行状态的线程获得了 cpu 时间片timeslice后就处于 **RUNNING运行** 状态。
> 操作系统隐藏 Java虚拟机JVM中的 RUNNABLE 和 RUNNING 状态,它只能看到 RUNNABLE 状态(图源:[HowToDoInJava](https://howtodoinjava.com/)[Java Thread Life Cycle and Thread States](https://howtodoinjava.com/java/multi-threading/java-thread-life-cycle-and-thread-states/)),所以 Java 系统一般将这两个状态统称为 **RUNNABLE运行中** 状态 。
![RUNNABLE-VS-RUNNING](https://my-blog-to-use.oss-cn-beijing.aliyuncs.com/2019-3/RUNNABLE-VS-RUNNING.png)
当线程执行 `wait()`方法之后,线程进入 **WAITING等待**状态。进入等待状态的线程需要依靠其他线程的通知才能够返回到运行状态,而 **TIME_WAITING(超时等待)** 状态相当于在等待状态的基础上增加了超时限制,比如通过 `sleeplong millis`方法或 `waitlong millis`方法可以将 Java 线程置于 TIMED WAITING 状态。当超时时间到达后 Java 线程将会返回到 RUNNABLE 状态。当线程调用同步方法时,在没有获取到锁的情况下,线程将会进入到 **BLOCKED阻塞** 状态。线程在执行 Runnable 的` run() `方法之后将会进入到 **TERMINATED终止** 状态。
## 31 关于 final 关键字的一些总结
final关键字主要用在三个地方变量、方法、类。