wait()和wait(timeout)之间有什么区别.Anyway wait()需要等待通知调用,但为什么我们要等待(超时)?
那么睡眠(超时)和等待(超时)之间有什么区别?
答案 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)
不同之处在于这些方法是为不同目的而设计的。休眠用于在线程执行中引入无条件延迟,而等待用于线程之间的同步,例如:
如果您想实施倒计时,延迟,计时器,您应该使用 sleep(t)。
如果您有2个(或更多)线程,其中1st是随机生成数据的生产者,而2nd是消费者,它消耗第1个提供的,您应该去 wait()/ notify( )模式或考虑使用现代更方便的包装器进行此线程同步(如果它存在于您的平台上)。
如果你有案例2,但是你想在一段时间之后添加一个超时而不是在wait()中永久挂起,你可以去 wait(t)而不是<强>等待()强>
事实上,如果你从不通知,等待(t)的行为类似于睡眠(t) - 它会在超时后返回,所以你可以将它用于案例1,但它更笨拙和丑陋。