我需要提供一种阻塞的方法,直到处理完BlockingQueue中的所有未完成的工作为止。
我当时想我可以使用计数信号量来处理此问题,该信号量将从0开始并随着项目添加到队列而递减,并在完成时增加。 finish()只会获取信号量,然后再次释放它并离开。
我也许可以调用reducePermits()。如果许可计数已经小于0,这行得通吗?它是 protected ,因此我需要扩展Semaphore类以使其起作用。
我的第二个最好的主意是在循环中检查队列的内容,并在两次检查之间 sleep 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等),然后进行最终处理。