Java等效的.NET的ManualResetEvent和WaitHandle

Orc*_*rca 13 .net c# java eclipse synchronization

我想知道Java是否提供了类似于.NET的ManualResetEvent和WaitHandle类,因为我想编写阻止给定超时的代码,除非事件被触发.

WaitHandle和ManualResetEvent的.NET类为我提供了一个很好的,无障碍的接口,据我所知也是线程安全的,所以Java提供了什么?

Jon*_*eet 14

您是否考虑使用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
}
Run Code Online (Sandbox Code Playgroud)

请注意,这与ManualResetEvent每个成功调用tryAcquire会减少许可数量不同 - 所以最终它们会再次耗尽.你不能像你一样永久地"设置"它ManualResetEvent.(那会有用CountdownLatch,但是你不能"重置"它:)