一.线程的五个状态
状态图如下
1)新建状态
新建了一个线程对象。
2)就绪状态
其他线程 调用了该线程对象的start()方法后(此时已获得对象锁)即进入临界区,等待cpu切换线程状态(即获取cpu时间片)然后进入运行状态。
3) 运行状态
获取了时间片,开始执行程序代码。(对cpu内核,进程,线程等不了解的可以翻看我的其他文章)
4) 阻塞状态
线程因为没有获取到锁而进行等待。需要进入就绪状态,然后运行状态。造成当前情况主要有以下三种原因:
一。等待阻塞:运行的线程调用wait()方法释放锁,jvm 将线程放入"等待池"(形象栗子),其实是进入Wait Set
等待集(jvm为每个对象都维护了两个类似队列样的数据结构,不一定符合先进先出原则),等待集存储执行了wait()方法
的线程。
二。同步堵塞
线程申请锁而落选,jvm将这些线程放入“锁池”即Entry Set入口集。
三。其他堵塞
比如sleep()和join(),以及io请求等,当sleep超时(之间不会释放锁)、join线程终止以及io处理完毕,此时线程才会进入就绪状态。
5 ) 死亡状态
当线程执行结束或者因异常退出run()方法时,此线程周期结束。
**************
奥特曼打怪兽
**************
1.线程yield()方法,放弃当前获取的时间片,进入就绪状态。
2.suspend()与resume()以及wait()与notify()区别,前者阻塞时(获取到了锁的情况下)不会释放锁(这里可能产生死锁),后者主动释放锁(此处说明必须在同步块里了不然抛出IllegalMonitorStateException),当然如果是wait()而不是wat(int xxx)方法则也可能出现死锁。