在java的API文档里,Thread类有一个外部类State,形容了线程的六个状态。见下图。
首先讲一下三个最根本的状态:就绪态、运行态、终止态。
NEW:就绪态new Thread();
或者new Thread子类();
这两行代码执行后,线程就处于就绪态,此时线程没有开启。
RUNNABLE:可运行
线程调用start()
办法能够进入到可运行状态。
可运行状态就是线程能够在java虚拟机中运行的状态。此时他可能正在运行
,也有可能正在期待
因为cpu要不停地切换执行线程。留神这两种状态都是可运行状态。
Teminated(被终止)
因为线程的run办法失常执行完结或者被调用了stop办法被终止,这个时候就是被终止状态。
接下来是另外三个状态
Blocked(锁阻塞)
在线程处于可运行状态的时候,他可能会尝试获取锁。
如果他没有获取到锁,那么这个过程就处于阻塞态。
如果获取到了锁,就转成了可运行态。
Waiting(有限期待)
线程调用wait()
办法,此时从运行态变成了有限期待。
进入此状态后,线程始终期待被其余线程唤醒,也就是期待其余线程获取此对象的锁,执行notify()
。
如果唤醒者线程获取此线程的锁
胜利执行了notify()
,这个线程就被唤醒,进入到可运行。
如果唤醒者线程没有胜利胜利获取锁,可运行状态进入到阻塞态。(尝试获取锁)
Timed Waiting(计时期待)
和无线期待相似,这里指定了等待时间,在这个工夫内始终期待被唤醒。常见的Thread.sleep
办法和wait(long time)
办法。
可运行态调用Thread.sleep
办法或wait(long time)
办法进入此状态。
等待时间内,获取到了锁,被唤醒进入可运行状态。
等待时间到,获取到了锁,被唤醒进入可运行状态。
等待时间完结,没有获取到锁,进入阻塞态。
最初放上一张图,(图片起源:刘乃源老师上课画的)