我需要提供一种阻塞方法,直到处理完 BlockingQueue 中所有未完成的工作。
我想我可以用一个计数信号量来处理这个问题,它从 0 开始,随着项目添加到队列中而递减,并在完成时递增。 finish() 只会获取信号量,再次释放它并离开。
我或许可以调用 reducePermits()。如果许可计数已经 < 0,这是否有效?它受到保护,因此我需要扩展 Semaphore 类才能使其正常工作。
我的第二个好主意是循环检查队列的内容,并在检查之间 hibernate 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();
}
}
最佳答案
您可以通过调用 drainTo(collection)
来清空队列,然后对所有项目调用自己的处理(可能通过 Futures 等),然后是最终处理。
关于Java无限计数信号量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10526178/