Java 线程在运⾏的⽣命周期中的指定时刻只可能处于下⾯ 6 种不同状态的其中⼀个状态(图源《Java 并发编程艺术》4.1.4 节)。
线程在⽣命周期中并不是固定处于某⼀个状态⽽是随着代码的执⾏在不同状态之间切换。Java 线程状态变迁如下图所示(图源《Java 并发编程艺术》4.1.4 节):
由上图可以看出:
线程创建之后它将处于NEW
(新建) 状态,调⽤start()
⽅法后开始运⾏,线程这时候处于READY
(可运⾏) 状态。可运⾏状态的线程获得了 cpu 时间⽚(timeslice)后就处于RUNNING
(运⾏) 状态。
操作系统隐藏 Java 虚拟机(JVM)中的
READY
和RUNNING
状态,它只能看到RUNNABLE
状态,所以 Java 系统⼀般将这两个状态统称为RUNNABLE
(运⾏中)状态 。
当线程执⾏wait()
⽅法之后,线程进⼊WAITING
(等待)状态。进⼊等待状态的线程需要依靠其他线程的通知才能够返回到运⾏状态,⽽TIME_WAITING
(超时等待)状态相当于在等待状态的基础上增加了超时限制,⽐如通过sleep(long millis)
⽅法或wait(long millis)
⽅法可以将 Java 线程置于TIMED WAITING
状态。当超时时间到达后 Java 线程将会返回到RUNNABLE
状态。当线程调⽤同步⽅法时,在没有获取到锁的情况下,线程将会进⼊到BLOCKED
(阻塞)状态。线程在执⾏Runnable
的run()
⽅法之后将会进⼊到 TERMINATED
(终⽌)状态。
留言