Java相当于ManualResetEvent吗?

2022-09-01 07:29:58

Java相当于ManualResetEvent吗


答案 1
class ManualResetEvent {

  private final Object monitor = new Object();
  private volatile boolean open = false;

  public ManualResetEvent(boolean open) {
    this.open = open;
  }

  public void waitOne() throws InterruptedException {
    synchronized (monitor) {
      while (open==false) {
          monitor.wait();
      }
    }
  }

  public boolean waitOne(long milliseconds) throws InterruptedException {
    synchronized (monitor) {
      if (open) 
        return true;
      monitor.wait(milliseconds);
        return open;
    }
  }

  public void set() {//open start
    synchronized (monitor) {
      open = true;
      monitor.notifyAll();
    }
  }

  public void reset() {//close stop
    open = false;
  }
}

答案 2

据我所知,最接近的是信号量。只需将其与“许可证”计数1一起使用,aquire/release将与您从中了解到的几乎相同。ManualResetEvent

初始化为 1 的信号量(其使用方式使其最多只有一个许可证可用)可以用作互斥锁。这通常被称为二进制信号量,因为它只有两种状态:一个许可证可用,或零个许可证可用。以这种方式使用时,二进制信号量具有属性(与许多 Lock 实现不同),即“lock”可以由所有者以外的线程释放(因为信号量没有所有权概念)。这在某些特殊情况下很有用,例如死锁恢复。