java并发:flag / event

时间:2010-11-04 15:01:23

标签: java events concurrency

我正在寻找java并发类中的一个不可重置的标志或事件类,我可以用它来检查某些事情是否完成并且是线程安全的。理想情况如下:

public interface Event
{
     /** returns true if signal() has been called */
     public boolean hasOccurred();
     /** returns when signal() has been called */
     public void await();
     public void signal();         
}

这样的事情是否存在?我想要记住脑痉挛

2 个答案:

答案 0 :(得分:14)

我认为你正在寻找CountDownLatch - 尤其是以1为实例进行实例化。

然后您的操作如下:

  • hasOccurred latch.getCount() == 0
  • 等待latch.await()
  • 信号latch.countDown()

如果您想要重复使用某些内容并重复使用,那么CyclicBarrier可能会更符合您的要求。 CountDownLatches一旦被触发,就无法重置。

编辑:值得注意的是,与您提到的Event界面相比,CountDownLatch更容易组合到更大的操作。因此,例如,如果您要等待4个工作线程完成,那么<​​em>可以为每个工作人员提供自己的事件/ 1计数锁存器并依次等待每个工作线程。但是,简单地创建一个计数为4的CountDownLatch,并在所有工作者之间共享这一点(可能根本不需要更改工作逻辑,而且不能简单地使用多个较小的事件) )。

答案 1 :(得分:1)

您的意思是Condition吗?

class BoundedBuffer {
   final Lock lock = new ReentrantLock();
   final Condition notFull  = lock.newCondition(); 
   final Condition notEmpty = lock.newCondition(); 

   final Object[] items = new Object[100];
   int putptr, takeptr, count;

   public void put(Object x) throws InterruptedException {
     lock.lock();
     try {
       while (count == items.length)
         notFull.await();
       items[putptr] = x;
       if (++putptr == items.length) putptr = 0;
       ++count;
       notEmpty.signal();
     } finally {
       lock.unlock();
     }
   }

   public Object take() throws InterruptedException {
     lock.lock();
     try {
       while (count == 0)
         notEmpty.await();
       Object x = items[takeptr];
       if (++takeptr == items.length) takeptr = 0;
       --count;
       notFull.signal();
       return x;
     } finally {
       lock.unlock();
     }
   }
 }