转载自:“熔岩”博客
原文地址:http://lavasoft.blog.51cto.com/62575/27069
说明:本文只选择了原文的线程状态转换部分,由于原图中的线程状态名称和Java文档中的名称不对应,所以本文重新绘制了状态转换图,并尽量保持了原图的内容和样式。
原图对线程转换的解释非常好,这里补充如下:
1 Thread.State中包含NEW、RUNNABLE、BLOCKED、WAITING、TIMED_WAITING和TERMINATED,并不包含RUNNING状态,但个人感觉区分RUNNING和RUNNABLE会更有利于理解;
2 调用threadObj.join()方法进入WAITING状态后,从WAITING状态离开并没有说明threadObj终止,因为线程终止会调用notifyAll();
3 从WAITING离开为什么要进入BLOCKED?因为调用obj.wait()需要在对象上同步,wait()成功后会释放锁,等待结束后还在同步代码块中,所以要进入BLOCKED获得锁。给出代码也许更好理解。
synchronized (obj) {
while (<condition does not hold>)
obj.wait();
... // Perform action appropriate to condition
}
关于本图的其他解释请移步到 原文。