2011-01-21 75 views
0

我面對的問題是我有一個線程A和n的工作需要完成。線程A必須等到這n個工作完成。我的想法是使用n個計數的CountDownLatch,並使用生產者/消費者模式來控制工人。等待完成n個作品完成:生產者,消費者和計數器

我使用AtomicInteger以充當計數器:生產者檢查計數器的值是大於0那麼把一個信號發送到BlockingQueue,如果計數器的值小於或等於0,生產者把一個stopSignal到隊列。消費者從隊列中取出,檢查信號是否與stopSignal不相等,然後使用ExecutorService安排Worker

工人呼叫getAndDecrement,檢查計數器的值大於0,如果是,那麼做的工作, 如果工作完成,然後調用CountDownLatch#倒計時否則增加計數器與incrementAndGet

的問題是當一項工作沒有完成時,工人必須增加計數器,但這是在getAndDecrement之後,因此生產者可能會看到計數器的值爲0,並且將停止信號放在一起,即使工作總量小於n!

+0

難道你不能剛剛開始* n *線程和`join()`它們全部嗎?也許吧。 – 9000 2011-01-21 04:11:25

回答

1

聽起來就像你正在處理一個典型的生產者/消費者問題,增加了一些複雜性(等待完成n個工作的新條件)。正如你所定義的,你有生產者和消費者。一個開始工作,第二個開始工作。

工作完成後遞增。工作完成後減少。這種方法會讓您的工作人員只在有工作時才嘗試從隊列中提取數據。

現在爲了解決您的問題,您正在等待n件作品的新條件完成。如果您正在等待一定數量的作業完成並且您清楚地意識到這些作業,則可以使用CyclicBarrier對象停止流程,直到所有作業都已到達屏障。

在併發情況下,通常有兩種座標工作者的方法。生產者/消費者可能不是這個問題的解決方案,也不是Barrier。我建議尋找java.util.concurrent包,因爲它可能會在這個主題上提供更多的信息。