千言万语抵不过一张图...
JAVA代码中线程共有6种状态除,RUNNING
是为了表示线程正在执行单独增加的一个逻辑状态,实际并没有。
重点关注的四种状态:RUNNABLE、BLOCKED、WAITING和TIME_WAITING,使用jstack打印的线程堆栈中时常会出现以上状态。
-
BLOCKED
: 线程在等待获取锁进入同步块或者同步方法中。两个死锁的线程即是Blocked。 -
WAITING
: 比BLOCKED状态进步一些,指我已经获得锁了,但由于有些条件不满足,我自己等会,调用object.wait()方法。等条件满足了,别的线程调用notify再叫我。另外也可以调用Thread.join()方法,顾名思义就是调用别的线程的join方法,让别人join进来先执行,那我就只能等会了。但是由于wait()和notify()以及notifyAll()用于协调对共享资源的存取,所以必须在synchronized块中使用。所以即便wait状态的线程被notfiy唤醒了,也需要再次获得锁,所以唤醒后进入Blocked状态。 -
TIMED_WAITING
:类比WAITING,差异是不需要notify()或者notifyAlL()方法唤醒,时间到了我自己醒了。另外sleep比较好理解,就是让当前线程睡一会,与wait的区别是它不释放锁。 -
RUNNABLE
: 在JAVA虚拟机中已经在运行,但是在等待操作系统资源,比如CPU时间片。