线程的五种状态图,以及它们之间的转换关系。
- 新建状态(New):线程对象被创立后,就进入了新建状态。例如,Thread thread = new Thread()。
- 就绪状态 (Runnable):也被称为“可执行状态”。线程对象被创立后,其它线程调用了该对象的 start() 办法,从而来启动该线程。例如,thread.start()。处于就绪状态的线程,随时可能被 CPU 调度执行。
- 运行状态(Running):线程获取 CPU 权限进行执行。须要留神的是,线程只能从就绪状态进入到运行状态。
-
阻塞状态(Blocked):阻塞状态是线程因为某种原因放弃 CPU 使用权,临时进行运行。直到线程进入就绪状态,才有机会转到运行状态。阻塞的状况分三种:
- 期待阻塞:通过调用线程的 wait()办法,让线程期待某工作的实现。
- 同步阻塞:线程在获取 synchronized 同步锁失败(因为锁被其它线程所占用),它会进入同步阻塞状态。
- 其余阻塞:通过调用线程的 sleep()或 join()或收回了 I / O 申请时,线程会进入到阻塞状态。当 sleep()状态超时、join()期待线程终止或者超时、或者 I / O 处理完毕时,线程从新转入就绪状态。
- 死亡状态 (Dead):线程执行完了或者因异样退出了 run() 办法,该线程完结生命周期。
wait(), notify(), notifyAll()
wait()的作用是让以后线程进入期待状态,同时,wait()也会让以后线程开释它所持有的锁。而 notify()和 notifyAll()的作用,则是唤醒以后对象上的期待线程;notify()是随机唤醒单个线程,而 notifyAll()是唤醒所有的线程。
yield() 与 wait()的比拟
wait()的作用是让以后线程由“运行状态”进入“期待 (阻塞) 状态”的同时,也会开释同步锁。而 yield()的作用是退让,它也会让以后线程来到“运行状态”。它们的区别是:
- wait()是让线程由“运行状态”进入到“期待 (阻塞) 状态”,而 yield()是让线程由“运行状态”进入到“就绪状态”。
- wait()是会线程开释它所持有对象的同步锁,而 yield()办法不会开释锁。
sleep() 与 wait()的比拟
wait()的作用是让以后线程由“运行状态”进入“期待 (阻塞) 状态”的同时,也会开释同步锁。而 sleep()的作用是也是让以后线程由“运行状态”进入到“休眠 (阻塞) 状态”。然而,wait()会开释对象的同步锁,而 sleep()则不会开释锁。