2013-03-26 44 views
1

假設我在一個程序中有多個Runnable實例,所有實例都由一個Executor實例分派。此外,假設我在某些時候需要等待這些可運行子集的一個子集才能繼續前進。我能做到這一點我可以以更好的方式加入主題嗎?

的一種方法如下:然後

public abstract class Joinable implements Runnable { 

    private final Semaphore finishedLock = new Semaphore(1); 

    @Override 
    public final void run() { 
     try { 
      finishedLock.acquireUninterruptibly(); 
      doWork(); 
     } finally { 
      finishedLock.release(); 
     } 
    } 

    public abstract void doWork(); 

    public void join() { 
     finishedLock.acquireUninterruptibly(); 
    } 
} 

實現類可以簡單地重寫的doWork(),而不是運行(),以界定什麼應該執行期間進行。

連接過程會那麼只需像這樣:

void doStuff() { 

    Executor executor = Executors.newCachedThreadPool(); 

    List<Joinable> joinables = new LinkedList<Joinable>(); 
    // Fill joinables with implementors of Joinable... 

    List<Runnable> others = new LinkedList<Runnable>(); 
    // Fill others with implementors of Runnable... 

    for(Joinable joinable : joinables) 
     executor.execute(joinable); 

    for(Runnable runnable : others) 
     executor.execute(runnable); 

    for(Joinable joinable : joinables) 
     joinable.join(); 

    // Continue, no matter what the threads in others are up to. 
} 

這是解決這個問題(是連安全?)一個很好的方式,或者是有一個更好的?

回答

2

您目前的解決方案不是線程安全的。在致電join之前,執行人不會保證執行人會在您的Joinable上致電run。因此,在某些情況下,您的主線程會在您的Joinable之前獲得鎖。

如果您知道可連接總數N,則可能的解決方案是使用CountDownLatch,您將創建一個CountDownLatch(N)並將其傳遞給每個實例。當每個可連接完成時,請撥打countDown()。您的主線程在鎖存器上調用await()await()不返回,直到鎖存計爲0

+0

我也喜歡其他的答案,但是隨着我的項目的整體設計進行得很順利,我就選擇了這個答案。 – csvan 2013-03-27 09:52:24

1

這是解決這個問題的好辦法(是連安全?)

這是不完全正確。您無法加入由ExecutorService執行的Runnable。如果你想使用一個名單,然後做這樣的事情:

或者是有一個更好的?

如果你在等待所有任務來完成,那麼你可以使用ExecutorService.awaitTermination(long timeout, TimeUnit unit)方法。例如:

executor.awaitTerminate(Long.MAX_VALUE, TimeUnit.MILLISECONDS); 

但是,如果您正在等待任務的一個子集,我沒有看到任何更好的方法。

+0

我知道,不幸的是我需要澄清的問題了一下: 我不看的情況下我只有一種由同一出動運行實例的遺囑執行人。舉例來說,我有12個實例和另一個6個實例,我只想在繼續前進之前等待前12個實例,而不管其他6個實例在當時的狀態如何。在這種情況下,我不能使用awaitTermination。 – csvan 2013-03-26 21:00:47

+0

我已經添加了一些關於使用'submit(...)'方法@chrsva返回的'Future'的更多細節。 – Gray 2013-03-26 21:01:40

相關問題