介绍
线程状态必须和锁一起说才完整。这里,主要是给出一张线程状态的图,并对几个重要的点进行提醒。看完,大家有一个初步的印象,可以自选感兴趣的点继续深入
Thread状态图(包含加锁后与线程状态相互间的联系)

阅读
阅读这张图,主要充实阻塞状态的内容
阻塞状态
阻塞状态是指线程因为某种原因放弃了cpu 使用权,也即让出了cpu timeslice,暂时停止运行。直到线程进入可运行(runnable)状态,才有机会再次获得cpu timeslice 转到运行(running)状态。阻塞的情况分三种:
- 等待阻塞:运行(running)的线程执行o.wait()方法,JVM会把该线程放入等待队列(waitting queue)中
- 同步阻塞:运行(running)的线程在获取对象的同步锁时,若该同步锁被别的线程占用,则JVM会把该线程放入锁池(lock pool)中。
- 其他阻塞:运行(running)的线程执行Thread.sleep(long ms)或t.join()方法,或者发出了I/O请求时,JVM会把该线程置为阻塞状态。当sleep()状态超时、join()等待线程终止或者超时、或者I/O处理完毕时,线程重新转入可运行(runnable)状态。
- 图中sleep,join属于其它阻塞。他们不会释放锁。sleep,一段时间后进入runnable状态。join,子线程完成或者一段时间后进入runnable状态
- 图中wait,jvm把线程发放入等待队列,属于等待阻塞。会释放对象锁。进入等待队列,通过object的notify,notifyall唤醒进入锁池队列。
额外介绍下Thread.yeild方法,此方法不会导致阻塞,让当前线程直接进入runnable状态。