1、java线程状态有这几种:new, runable, ready, block, timed waiting, waiting, dead。其中 waiting 和 timed waiting 是调用wait, sleep等方法进入的;block状态比较特殊,是进入synchronized块时等待锁进入的。
2、监视器中有entry set 和 wait set的概念,其中entry set 中的线程即出于block状态,此时他们想要获得synchronized的锁;一旦进入monitor之后,再接到wait函数调用,便进入wait set,此时对应waiting 或者 timed waiting的状态。
3、简单的理解同步队列存放着竞争同步资源的线程的引用(不是存放线程),而等待队列存放着待唤醒的线程的引用。即等待队列中的线程被notify()唤醒,加入同步队列里竞争锁,同步队列也称为等锁池,此时这些线程状态为block;占有锁的线程运行到wait()后,移入等待队列中,等待队列也称为等待池,线程状态为waiting。
总结如下:
线程状态 | 调用方法 | 队伍 | 池子 | 监视器状态 |
---|---|---|---|---|
block | notify | 同步队列 | 等锁池 | wait set |
waiting | sleep / wait | 等待队列 | 等待池 | entry set |