Orc*_*rca 13 .net c# java eclipse synchronization
我想知道Java是否提供了类似于.NET的ManualResetEvent和WaitHandle类,因为我想编写阻止给定超时的代码,除非事件被触发.
WaitHandle和ManualResetEvent的.NET类为我提供了一个很好的,无障碍的接口,据我所知也是线程安全的,所以Java提供了什么?
Jon*_*eet 14
您是否考虑使用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
}
Run Code Online (Sandbox Code Playgroud)
请注意,这与ManualResetEvent每个成功调用tryAcquire会减少许可数量不同 - 所以最终它们会再次耗尽.你不能像你一样永久地"设置"它ManualResetEvent.(那会有用CountdownLatch,但是你不能"重置"它:)