本文主要介紹的工具包括:
countdownlatch可以使乙個或多個執行緒等待一組事件發生。在countdownlatch內部維護乙個計數器(被初始化為乙個正整數),表示需要等待事件的數量。countdown()
方法減少乙個事件數量,await()
將等待直到計數器為零的時候,才繼續執行await後面的**。如果計數器不為零,那麼await將一直會阻塞等待直到計數器為零,或者阻賽執行緒中斷/超時。
@test
public void test() throws interruptedexception catch (interruptedexception ignore)
}}).start();
// sleep 0.5ms
timeunit.milliseconds.sleep(500);
}long starttime = system.currenttimemillis();
startevent.countdown();
// wait for all thread finish
finishevent.await();
system.out.println("total finish cost : " + (system.currenttimemillis() - starttime) + "ms");
}
這個例子展示了如何在同一時間啟動threadnum
個執行緒,並且這threadnum
個執行緒都完成後,記錄執行結果。startevent.await()
將等待直到呼叫startevent.countdown()
。這是,所有執行緒在同一時間啟動。當每個執行緒執行完畢的時候,會呼叫finishevent.countdown()
通知給主線程,finishevent.await()
將等待直到所有子執行緒都執行完畢。
列印結果:
thread[thread-1,5,main] start at : 1359782125125
thread[thread-8,5,main] start at : 1359782125125
thread[thread-7,5,main] start at : 1359782125125
thread[thread-6,5,main] start at : 1359782125125
thread[thread-5,5,main] start at : 1359782125125
thread[thread-3,5,main] start at : 1359782125125
thread[thread-0,5,main] start at : 1359782125125
thread[thread-2,5,main] start at : 1359782125125
thread[thread-4,5,main] start at : 1359782125125
total finish cost : 1ms
semaphore在內部持有乙個虛擬的許可組(初始化的時候可以設定虛擬組的數量),當執行某個操作的時候,呼叫acquire
獲得許可,在操作執行完成後呼叫release
釋放許可。如果沒有許可可用,那麼acquire
方法會一直阻賽直到有許可可用為止,或者執行獲取許可的執行緒終端或阻賽。
semaphore可以用來控制某種資源的使用數量,或者同時使用特定資源的數量。利用這個特性,可以實現某種資源的資源池或者對容器實加邊界。
@test
public void test() throws interruptedexception catch (interruptedexception ignore) }}
}).start();
timeunit.seconds.sleep(1);
new thread(new runnable() catch (interruptedexception ignore) }}
}).start();
thread.currentthread().join();
}static class boundedlist
public boolean add(t o) throws interruptedexception finally }}
public boolean remove(t o)
return removed;
}}
這個例子展示了乙個帶邊界的list
,當向集合中新增元素的時候,首先獲取許可。如果新增失敗了,那麼釋放許可
。當刪除集合中的元素的時候,如果刪除成功,釋放乙個許可。這樣就能保證集合中的元素都是獲得許可後才新增進來的,從而保證了集合的邊界。
列印結果:
1359787233784 add 1
1359787233784 add 2
1359787233784 add 3
1359787233784 add 4
1359787233784 add 5
1359787234787 add 6
1359787234787 remove 1
1359787235288 remove 2
1359787235288 add 7
1359787235789 remove 3
1359787235789 add 8
1359787236290 remove 4
1359787236290 add 9
….
在這個例子中,生產者向集合中新增元素,消費者刪除元素,因為生產者的速度大於消費者,所以當集合中元素等於5的時候,就必須等待消費者刪除乙個元素後才能再繼續新增,從列印結果可以看出這點。
cyclicbarrier和countdownlatch有些類似,它阻塞一組執行緒直到某個事件發生。可以把cyclicbarrier理解成乙個障礙,當所有執行緒都到達這個"障礙"的時候,才能繼續下個事件。如果所有執行緒到達barrier處,barrier開啟釋放所有執行緒,並且barrier可以繼續使用。如果await
方法超時,或者被中斷,那麼認為barrier被打破,所有在await上阻塞的執行緒都將丟擲brokenbarrierexception
。
@test
public void test() throws interruptedexception
});while (true) catch (interruptedexception e) catch (brokenbarrierexception e)
}});
}}
這個例子假設有一堆執行緒到達gate
處,每當到達gate
處的執行緒數達到gate_threshold
時,gate
開啟釋放這些執行緒並進入下次一次迴圈。
exchanger提供兩個執行緒以執行緒安全的形式交換資料,exchange等待另乙個執行緒到達exchange方法,然後把資料給另乙個執行緒並且接收另乙個執行緒交換過來的資料。
@test
public void test() throws interruptedexception catch (interruptedexception ignore)
}else catch (interruptedexception ignore) }}
}});
producer.start();
consumer.start();
producer.join();
consumer.join();
}
這個例子展示了乙個生產者/消費者的例子。當生產者填慢list後,等待交換。同樣當消費者消耗完list,也等待交換。 Java併發工具類
目錄 1.等待多執行緒完成的countdownlatch 2.同步屏障cyclicbarrier 3.控制併發執行緒數的semaphore 4.執行緒間交換資料的exchanger countdownlatch允許乙個或多個執行緒等待其他執行緒完成操作,類似於join方法。join的實現原理是不停的...
java中的併發工具類
類名稱類的簡介 類的特點 countdownlatch 允許乙個或者多個執行緒等待其他執行緒完成之後再執行後續操作 countdownlatch提供了乙個計數器,只能初始化一次,但是提供了乙個await方法,允許設定乙個時間,當等待一段時間後,就會不再阻塞當前執行緒。cyclicbarrier 讓一...
Java併發工具類之CyclicBarrier
cyclicbarrier的意思是可迴圈使用的屏障。它可以讓一組執行緒到達乙個屏障時被阻塞,直到最後乙個執行緒到達屏障時,屏障才會開門,所有阻塞的執行緒才會繼續執行。它就好像一道關卡,只有所有的部隊 執行緒 都到了才能放行。部分原始碼 public class cyclicbarrier 可以看到,...