【问题标题】:Wait for another thread to do something等待另一个线程做某事
【发布时间】:2018-11-27 13:28:57
【问题描述】:

我有两个线程,AB。我想要以下内容:

  • 我想让A 等到B 开始执行f()。一旦B 开始执行f(),A 也可以继续其工作。
  • 如果B 已经在执行f()A 通知B 其状态,A 也可以继续其工作。
  • 如果B 完成执行f()A 必须等到B 将来再次开始执行f()

在函数中:

// executed by A only
public void waitForB() throws InterruptedException {
    // keep waiting until B starts f()
}

// executed within aroundF() only
public void f() {
}

// executed by B only
public void aroundF() {
    // 1. mark that we are executing f() and inform A
    f()
    // 2. unmark 
}

我一直在尝试使用 SemaphorePhaserCyclicBarrier,但我很难理解在这里使用哪个。

我设法通过手动锁定来实现这一点(见下文),但我想了解在此处使用哪个 java.util.concurrent 类。

private final    Object  lock      = new Object();
private          boolean executing = false;

public void waitForB() throws InterruptedException {
    synchronized(lock) {
        while(!executing) {
            lock.wait();
        }
    }
}

public void f() {
}

public void aroundF() {
    try {
        synchronized(lock) {
            executing = true;
            lock.notify();
        }
        f();
    } finally {
        executing = false;
    }
}

【问题讨论】:

    标签: java concurrency java.util.concurrent


    【解决方案1】:

    您可以使用java.util.concurrent.locks.Lock 和关联的java.util.concurrent.locks.Condition 实现相同的语义(甚至更多),例如:

    public class MyClass {
      private final Lock lock = new ReentrantLock();
      private final Condition condition = lock.newCondition();
      private boolean executing = false;
    
      public void waitForB() throws InterruptedException {
        lock.lock();
        try {
          while (!executing) {
            condition.await();
          }
        } finally {
          lock.unlock();
        }
      }
    
      public void f() {
      }
    
      public void aroundF() {
        try {
          lock.lock();
          try {
            executing = true;
            condition.signal();
          } finally {
            lock.unlock();
          }
          f();
        } finally {
          executing = false;
        }
      }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-04
      • 2011-07-21
      • 1970-01-01
      • 1970-01-01
      • 2015-02-22
      相关资源
      最近更新 更多