我需要提供一种阻塞方法,直到处理完 BlockingQueue 中的所有未完成的工作。
我在想我可以用一个计数信号量来处理这个问题,它从 0 开始,随着项目添加到队列中而递减,并在它们完成时递增。finish() 只会获取信号量,再次释放它并离开。
我也许可以调用 reducePermits()。如果许可计数已经 < 0,这是否有效?它受到保护,因此我需要扩展 Semaphore 类以使其工作。
我的第二个最佳想法是循环检查队列的内容,并在检查之间休眠 100 毫秒左右。它有效,但看起来很笨拙。
这有意义吗?有人有更简单/更清洁的建议方式吗?
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();
}
}