【发布时间】:2018-11-27 13:28:57
【问题描述】:
我有两个线程,A 和 B。我想要以下内容:
- 我想让
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
}
我一直在尝试使用 Semaphore、Phaser 和 CyclicBarrier,但我很难理解在这里使用哪个。
我设法通过手动锁定来实现这一点(见下文),但我想了解在此处使用哪个 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