2010-11-04 67 views
6

我在java併發類中尋找一個不可重置的標誌或事件類,我可以用它來檢查是否已完成並且是線程安全的。理想情況是這樣的: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();   
} 

這樣的事情已經存在了嗎?我有一個腦抽筋試圖記住

回答

14

我認爲你正在尋找一個CountDownLatch - 尤其是,與1

計數實例化它,然後你的操作如下:

  • hasOccurredlatch.getCount() == 0
  • 等待latch.await()
  • 信號latch.countDown()

如果你想要的東西,你可以重置和重複使用,那麼CyclicBarrier可能會更你在找什麼。 CountDownLatches一旦被觸發,就不能被重置。

編輯:值得注意的是,CountDownLatch比您提到的Event接口更容易組合成更大的操作。例如,如果您要等待4個工作線程完成,您可以給每個工作人員分配自己的事件/ 1個計數鎖存,然後依次等待每個工作線程。不過,可以說乾淨利落的是,只需創建一個計數爲4的CountDownLatch,並在所有工作人員之間共享(根本不需要對工作邏輯進行任何更改即可完成此任務) )。

+0

ah:謝謝,那有效! +1。 – 2010-11-04 15:06:47

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