sleep()保持锁定,但wait()不保持,
我对等待的想法是它释放锁定,以便让其他线程有机会在等待时获取该线程上的监视器。
但怀疑睡眠()为什么线程在睡觉时保持锁定,因为它在睡觉后总是进入可运行状态
答案 0 :(得分:2)
Thread.sleep与锁定没有任何关系。
当持有锁时需要调用Object.wait,因为需要在持有锁的同时完成对等待条件的测试,以便具有一致的条件视图。但通常一个线程在睡觉时都没有锁定。
拿着锁睡觉似乎是非常糟糕的行为。但是如果你需要多个锁,你需要多个锁,并且在重试另一个之前必须退回,那么在拿着锁时睡觉可能是有意义的。如果调用睡眠释放锁定,这种退避策略将无效。
让Thread.sleep忘记锁定会使API更简单,并为程序员提供更多选项(通过不完全排除需要保持锁定的线程的使用)。
答案 1 :(得分:2)
为什么线程在睡觉时保持锁定,因为它在睡觉后总是进入可运行状态
考虑以下情况: -
private Object objLock = new Object();
public void myMethod() {
....
synchronized(objLock) {
Thread.sleep(1000); // make the current running thread sleep for 1 second only.
... // Code here which needs to be executed immediately after 1 second sleep time
}
....
}
如果在上面的代码中调用sleep时,所有JVM都会锁定,那么当它恢复到runnable状态时(恢复执行将取决于调度以及根据JLS执行线程的处理器的可用性{{3如果另一个线程偶然发生锁定会导致程序行为不一致,那么你的程序可能根本不会恢复。这可能是它不释放任何锁的原因之一。
答案 2 :(得分:0)
问: Thread.sleep(n)做什么?
A: 没有。绝对没什么。
问:需要多长时间? A:如果线程没有中断,则至少n毫秒。
您不需要了解Thread.sleep()的其他信息。