java并发:标志/事件

java并发:标志/事件,java,events,concurrency,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();

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

这样的事情已经存在了吗?我的大脑在试图记忆时抽筋了

我想你在寻找一个-特别是,用一个1的计数来实例化它

那么您的操作如下:

  • 已发生
    闩锁.getCount()==0
  • await
    latch.await()
  • 信号
    锁存.倒计时()
如果你想要一些你可以重置和重复使用的东西,那么a可能就是你想要的。一旦触发倒计时闩锁,就无法重置

编辑:值得注意的是,倒计时闩锁也比您提到的
事件
接口更容易组合成更大的操作。例如,如果要等待4个工作线程完成,可以为每个工作线程提供自己的event/1-count-lack,然后依次等待。不过,简单地创建一个计数为4的CountDownLatch,并在所有工作程序之间共享它(这一点根本不需要更改工作程序逻辑,而且不能像简单地使用多个较小的事件那样完成)。

您的意思是

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