我需要提供一个阻止方法,直到BlockingQueue中的所有未完成工作都已处理完毕。
我以为我可以用一个计数的信号量来处理这个信号量,该信号量从0开始并随着项目被添加到队列中而递减,并在完成时递增。 finish()只会获取信号量,再次释放它并离开。
我也许可以调用reducePermits()。如果许可证计数已经是< 0?它受到保护,所以我需要扩展Semaphore类才能使它工作。
我的第二个最好的想法是在循环中检查队列的内容,并在检查之间休眠100ms左右。它有效,但看起来像kludgey。
这有意义吗?任何人都有一个更容易/更清晰的建议方式?
TIA, - 蒂姆。
public MyClass {
public class MySemaphore extends Semaphore {
public void seize() {
reducePermits(1);
}
}
private MySemaphore allDone = new MySemaphore();
void startSomething() {
allDone.seize();
}
void finishSomething() {
allDone.release();
}
void finish() {
allDone.acquire();
allDone.release();
}
}