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

Jav*_*ser 3 java multithreading

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

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

Bor*_*lid 11

如果线程在超时过后仍在等待,则wait(timeout)将返回.这适用于挂起通知,低功耗轮询等.睡眠(超时)在超时结束前不会唤醒; wait(timeout)是notify()调用或超时,以先到者为准.

引用JavaDoc:

此方法使当前线程(称为T)将自身置于此对象的等待集中,然后放弃此对象上的任何和所有同步声明.线程T因线程调度而被禁用,并且在发生以下四种情况之一之前处于休眠状态:

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

  • 就这样说...如果线程中断,睡眠(超时)将被唤醒.但是,其他任何人都应该这样做. (3认同)

xag*_*gyg 5

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

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

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