Java无限计数信号量?

时间:2012-05-10 00:56:48

标签: java multithreading semaphore

我需要提供一个阻止方法,直到BlockingQueue中的所有未完成工作都已处理完毕。

我以为我可以用一个计数的信号量来处理这个信号量,该信号量从0开始并随着项目被添加到队列中而递减,并在完成时递增。 finish()只会获取信号量,再次释放它并离开。

我也许可以调用reducePermits()。如果许可证计数已经是< 0?它受到保护,所以我需要扩展Semaphore类才能使它工作。

我的第二个最好的想法是在循环中检查队列的内容,并在检查之间休眠100ms左右。它有效,但看起来像kludgey。

这有意义吗?任何人都有一个更容易/更清晰的建议方式?

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();
  }
}

1 个答案:

答案 0 :(得分:2)

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