参考书籍:java多线程编程核心技术
如上图所示:
我们可以清楚的看到线程的几种状态
1.新建:使用NEW关键字来创建线程。
2.可运行:当前线程调用start()方法,使线程处于Runnable 状态,等待获取CPU。
3.运行中:如果线程抢到了CPU资源,这时的线程处于Running状态,Runnable和Running是可以相互切换的,比如,其他优先级较高线程抢占CPU资源,这时候线程就会变为Runnable状态。
进入Runnable状态大体分为5种:
- 线程调用sleep()方法经过的时间超过了指定的时间。
- 线程正在等待某个通知,其他线程发出了通知。
- 处于挂起的线程调用resume()方法。
- 线程调用的阻塞IO已返回,阻塞方法执行完毕。
- 线程成功的获取到了同步监视器。
4.阻塞:出现Blocked的情况大概分为5种
- 线程调用sleep()方法,主动放弃占用的CPU资源。
- 线程调用wait()方法,等待某个通知。
- 线程调用suspend()方法将线程挂起,容易导致死锁,尽量避免使用此方法。
- 线程调用阻塞式IO方法,在方法返回前,线程被阻塞。
- 线程试图获得一个同步监视器,但该同步监视器被其他线程所持有。
5.死亡:run()方法运行结束后进入销毁阶段,整个线程执行完毕。