我需要知道,如果有一些框架可以为我提供这种功能。我在一个方法中有一个关键部分,我需要很少的其他方法等待这个关键部分执行和完成。如果关键部分不活跃,那些方法应该流畅地工作。
如果仅在没有线程处于semaphored方法时输入临界区。
如:
public class Worker {
private Critical critical = null;
private CriticalDependent dep1 = null;
private CriticalDependent dep2 = null;
public Worker() {
critical = new Critical();
dep1 = critical.registerDependent();
dep2 = critical.registerDependent();
}
public void critical() {
critical.enter();
critical.waitForClearToGo();
// protected unique code
// change resource handle etc
critical.exit();
}
public void dependent1() {
critical.checkWaitAndUnsetClearToGo(this.dep1);
// some dependent code
// use resource handle
critical.setClearToGo(this.dep1);
}
public void dependent2() {
critical.checkWaitAndUnsetClearToGo(this.dep2);
// some dependent code
// use resource handle
critical.setClearToGo(this.dep2);
}
}
我可以找出一些解决方案,但我更喜欢使用现有的框架。我找不到现有的。提前谢谢。
答案 0 :(得分:2)
使用标准Java Semaphore。
答案 1 :(得分:1)
你可以用Erik已经讲过的Java Semaphore来做到这一点。 但是,您需要一个具有2个许可证,以便您的2个依赖方法可以同时运行,但关键部分将阻止这两个依赖方法。
Semaphore semaphore = new Semaphore(2, true); // Make it fair, so critical section won't wait unnecessarily
public void critical() {
semaphore.acquire(2); // Blocks both dependents, waiting if they're not available
...
semaphore.release(2);
}
public void dep1() {
semaphore.acquire(); // Blocks only if critical() has both permits
...
semaphore.release();
}
public void dep2() {
semaphore.acquire(); // Ditto, dep1() can have the other permit
...
semaphore.release();
}