3

我需要提供一种阻塞方法,直到处理完 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();
  }
}
4

1 回答 1

2

您可以通过调用来排空队列drainTo(collection),然后在所有项目上调用自己的处理(可能通过 Futures 等),然后是最终处理。

于 2012-05-10T01:25:40.700 回答