线程状态切换示意图

线程生命周期

1)创建一个新的线程对象后,调用它的start()
方法,系统会为此线程分配
CPU
资源,此时
线程处于
runnable(可运行)状态,这是一个准备运行的阶段。如果线程抢占到
CPU资源,则此线程就处于
running(运行)状态。
2
)
runnable
状态和
running状态可相互切换,因为有可能线程运行一段时间后,其他高优先级
的线程抢占了
CPU
资源,这时此线程就从running状态变成
runnable状态。
线程进入runnable状态大体分为如下4种情况
- ·调用sleep()方法后经过的时间超过了指定的休眠时间;
- ·线程成功获得了试图同步的监视器;
- ·线程正在等待某个通知,其他线程发出了通知;
- ·处于挂起状态的线程调用了resume恢复方法。
3
)
blocked是阻塞的意思,例如,如果遇到了一个
I/O
操作,此时当前线程由
runnable运行状态转成
blocked
阻塞状态,等待
I/O操作的结果。这时操作系统会把宝贵的
CPU时间片分配给其他线程,当
I/O
操作结束后,线程由
blocked状态结束,进入
runnable
状态,线程会继续运行后面的任务。
出现阻塞的情况大体分为如下5种
- .线程调用sleep()方法,主动放弃占用的处理器资源。
- ·线程调用了阻塞式I/O方法,在该方法返回前,该线程被阻塞。
- ·线程试图获得一个同步监视器,但该同步监视器正被其他线程所持有。
- ·线程等待某个通知(notify)。
- ·程序调用了suspend()方法将该线程挂起。此方法容易导致死锁,应尽量避免使用该方法。
4
)
run()方法运行结束后进入销毁阶段,整个线程执行完毕。