与线程的等待和睡眠方法混淆

时间:2014-08-29 17:30:15

标签: java multithreading

sleep()保持锁定,但wait()不保持,

我对等待的想法是它释放锁定,以便让其他线程有机会在等待时获取该线程上的监视器。

但怀疑睡眠()为什么线程在睡觉时保持锁定,因为它在睡觉后总是进入可运行状态

3 个答案:

答案 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()的其他信息。