我想知道Java是否提供了.NET的ManualResetEvent和WaitHandle类的等效类,因为我想编写代码,除非触发事件,否则它将在给定的超时时间内阻止。
据我所知,WaitHandle和ManualResetEvent的.NET类提供了一个不错的,无麻烦的接口(interface),据我所知,该接口(interface)也是线程安全的,那么Java必须提供什么?
最佳答案
您是否考虑过使用wait
/notify
(相当于Monitor.Wait
和Monitor.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/