WAIT()/等待(超时)/睡眠(超时)?

时间:2010-07-08 02:50:07

标签: java multithreading

wait()和wait(timeout)之间有什么区别.Anyway wait()需要等待通知调用,但为什么我们要等待(超时)?

那么睡眠(超时)和等待(超时)之间有什么区别?

4 个答案:

答案 0 :(得分:10)

如果线程在超时过后仍在等待,

wait(timeout)将返回。这适用于挂起通知,低功耗轮询等。睡眠(超时)将不会唤醒,直到超时为止; wait(timeout)是notify()调用或超时,以先到者为准。

从JavaDoc引用:

  

此方法使当前线程(称为T)置于其中   等待该对象的设置,然后放弃任何和所有   同步声明此对象。线程T被禁用   线程调度的目的和休眠直到四件事之一   发生的情况:

     
      
  • 其他一些线程调用此对象的notify方法,并且线程T恰好被任意选为线程   唤醒。
  •   
  • 其他一些线程调用此对象的notifyAll方法。
  •   
  • 其他一些线程中断了线程T。
  •   
  • 指定的实时时间已经或多或少。但是,如果超时为零,则不会采用实时时间   考虑和线程只是等待通知。
  •   

答案 1 :(得分:5)

wait(timeout):当超时到期时,线程唤醒并尝试重新获取同步锁(即,如果另一个线程在超时期限内没有通知它)。

sleep(超时):可以在没有任何sycnhronization代码的情况下使用sleep - 它只是让线程在指定的超时时间内进入休眠状态。请注意,必须在同步代码中使用wait。

因此,当您希望线程被另一个线程通知时使用wait(但可能不会,因此超时)。并且,必须在同步代码中调用wait。

答案 2 :(得分:3)

wait()wait(timeout)之间的唯一区别是wait() 永远不会在没有notify()的情况下醒来。 wait(timeout)超时>如果永远不会调用notify(),则0允许您“永远”锁定应用程序。

答案 3 :(得分:0)

不同之处在于这些方法是为不同目的而设计的。休眠用于在线程执行中引入无条件延迟,而等待用于线程之间的同步,例如:

  1. 如果您想实施倒计时,延迟,计时器,您应该使用 sleep(t)

  2. 如果您有2个(或更多)线程,其中1st是随机生成数据的生产者,而2nd是消费者,它消耗第1个提供的,您应该去 wait()/ notify( )模式或考虑使用现代更方便的包装器进行此线程同步(如果它存在于您的平台上)。

  3. 如果你有案例2,但是你想在一段时间之后添加一个超时而不是在wait()中永久挂起,你可以去 wait(t)而不是<强>等待()

  4. 事实上,如果你从不通知,等待(t)的行为类似于睡眠(t) - 它会在超时后返回,所以你可以将它用于案例1,但它更笨拙和丑陋。