我面對的問題是我有一個線程A和n的工作需要完成。線程A必須等到這n個工作完成。我的想法是使用n個計數的CountDownLatch
,並使用生產者/消費者模式來控制工人。等待完成n個作品完成:生產者,消費者和計數器
我使用AtomicInteger
以充當計數器:生產者檢查計數器的值是大於0那麼把一個信號發送到BlockingQueue
,如果計數器的值小於或等於0,生產者把一個stopSignal到隊列。消費者從隊列中取出,檢查信號是否與stopSignal不相等,然後使用ExecutorService
安排Worker
。
工人呼叫getAndDecrement
,檢查計數器的值大於0,如果是,那麼做的工作, 如果工作完成,然後調用CountDownLatch#倒計時否則增加計數器與incrementAndGet
的問題是當一項工作沒有完成時,工人必須增加計數器,但這是在getAndDecrement
之後,因此生產者可能會看到計數器的值爲0,並且將停止信號放在一起,即使工作總量小於n!
難道你不能剛剛開始* n *線程和`join()`它們全部嗎?也許吧。 – 9000 2011-01-21 04:11:25