调用sleep方法会暂时让出执行权,不参与cpu调度,而它持有的监视器锁是不会让出的,依旧是自己持有。到达指定时间后它就会返回成就绪状态,如果在sleep期间被interrupt了,那么会抛InterruptException异常。建议使用 TimeUnit类下的 sleep 方法实现该功能,增强可读性,例如 TimeUnit.SECONDS.sleep(1) 代表的就是休眠一秒。
如果线程调用yield方法,即表明让出自己这一轮剩余的时间片,等待cpu开启下一轮的时间片分配,而这个线程仍是就绪状态,不会被阻塞挂起。因为线程调度器会从线程就绪队列里面取出一个优先级最高的来,所以有可能取出来的还是这个线程。