Java无限计数信号量?

标签 java multithreading semaphore

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

相关文章:

c - Shell/C 信号量

java - libt2k.so 在armv7上执行jar时出错,如何修复?

java - 如何阻止 Applet 中的计数变量错误地递增?

java - android java权限拒绝manifest.xml

java - 快速排序实现问题,数组已排序但未退出递归中断条件

java - 适用于非线程安全代码的执行器

c - P线程同步: Back & Forth Reading of Two Text Files

javascript - 具有多线程的 Node.js 中的矩阵乘法?

multithreading - 德尔福 2010 : No thread vs threads

java - 在Java中使用信号量