- 锁池
所有需要竞争同步锁的线程都会放在锁池当中,比如某个对象的同步锁被其中一个线程得到,则其它线程需要在锁池中等待,当前面的线程释放掉同步锁后锁池中的线程去竞争同步锁,得到锁的线程进入就绪队列等待CPU资源分配。 - 等待池
当调用wait()方法后,线程会放到等待池中,等待池中的线程不会去竞争同步锁。只有调用了notify()或notifyAll()后等待池中的线程才会开始竞争同步锁,notify()是随机从等待池选出一个线程放到锁池,而notifyAll()是将等待池中的所有线程放到锁池中。
- sleep是Thread类的静态本地方法,wait是Object类的本地方法。
- sleep方法不会释放lock,但是wait会释放,而且会加入到等待队列中。
sleep()就是把CPU的执行资格和执行权释放出去,不再运行此线程,定时时间结束再取回cpu资源,参与cpu调度。如果sleep()时该线程有锁,sleep时不会释放这个锁,而是把锁带着进入冻结状态,也就是说其它需要这个锁的线程根本获取不到这个锁,则程序无法执行。
如果在睡眠期间其他线程调用了这个线程的interrupt方法,那么这个线程也会抛出interruptexception异常返回,这点和wait是一样的。 - sleep不需要被唤醒(休眠之后退出阻塞),但是wait需要(不指定时间需要被别人中断)
- join()执行后线程进入阻塞状态。例如在A线程中调用B线程的join()方法,则A线程就会进入阻塞队列,直到B线程执行结束或中断。
- yield()方法执行后线程直接进入就绪状态,马上释放了CPU的执行权,但依然保留了CPU的执行资格,所以有可能下次CPU进行线程调度这个线程还有获取到CPU执行权继续执行。