二、线程的状态和方法
线程的状态
上面提到了“就绪”这么个概念,那么线程还有哪些状态呢,这些状态之间又有什么联系呢,下面结合图片做详细的解释(java中的线程状态比较简单)。
![QQ截图20161209013122.png](https://images2015.cnblogs.com/blog/1088097/201612/1088097-20161229105707336-1836045664.png)
- 创建对象,此时只是在内存中有一个线程对象。
- 就绪状态,调用start(),此时进度就绪状态,但是此状态并不代表会立即执行,此时只是说明此线程万事具备只欠东风,CPU随时可以调用。
- 运行状态,此时run方法被执行。
- 堵塞状态,此时由于某些原因,线程暂停了,线程卡死了。
以下情况会导致线程的堵塞:
1、线程调用sleep方法主动放弃所占用的处理器资源
2、线程调用了堵塞式IO方法,在该方法返回前都会堵塞
3、线程试图获得一个同步监视器,但该同步监视器正在其他线程所持有(即当前线程所需锁,被其他线程锁持有)。
4、线程在调用wait方法,处于等待状态
5、调用suspend方法,线程被挂起。这个方法容易导致死锁,而且已经弃用了。只做了解。
解除线程堵塞的几种情况,可以使线程重新进入就绪状态:
1、调用了sleep方法的线程过了指定的时间
2、调用了阻塞式IO方法已经返回
3、线程成功取得了锁
4、线程处于等待状态时,收到了其他线程调用notify/notifyAll通知
5、处于挂起的线程调用了resume恢复方法(此方法也已经废弃) - 终止状态,线程执行完毕或者被强行杀死,此时线程处于中止状态。
常用方法
以上五种状态,Thread类中提供了各种方法,可以使得线程在这几种状态中相互转换。具体会导致线程堵塞的方法,上面已经说明。
![QQ截图20161209013905.png](https://images2015.cnblogs.com/blog/1088097/201612/1088097-20161229105711336-400839765.png)