我想知道Java是否提供了.NET的ManualResetEvent和WaitHandle类的等效类,因为我想编写代码,除非触发事件,否则它将在给定的超时时间内阻止。

据我所知,WaitHandle和ManualResetEvent的.NET类提供了一个不错的,无麻烦的接口(interface),据我所知,该接口(interface)也是线程安全的,那么Java必须提供什么?

最佳答案

您是否考虑过使用wait/notify(相当于Monitor.WaitMonitor.Pulse)?

您需要进行一点检查,以查看您是否确实需要等待(避免出现竞争状况),但是它应该可以工作。

否则,像 CountDownLatch 这样的东西很可能会满足您的要求。

编辑:我只注意到CountDownLatch基本上是“单一用途”-就我所知,您以后不能重置计数。您可能需要 Semaphore 。像这样使用tryAcquire等待超时:

if (semaphore.tryAquire(5, TimeUnit.SECONDS)) {
   ...
   // Permit was granted before timeout
} else {
   // We timed out while waiting
}

请注意,这与ManualResetEvent不同,因为每次成功调用tryAcquire都会减少许可数量-因此最终它们将再次用光。您无法像ManualResetEvent那样使它永久“设置”。 (这可以与CountdownLatch一起使用,但是您不能“重置”它:)

关于c# - Java与.NET的ManualResetEvent和WaitHandle等效,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3625967/

10-11 22:37