我需要提供一种阻塞的方法,直到处理完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等),然后进行最终处理。

10-06 14:10