Java并發– CyclicBarrier示例

Java中的CyclicBarrier是JDK 5中java.util.Concurrent包中引入的同步器,以及其他并發實用程序(如Counting Semaphore , BlockingQueue , ConcurrentHashMap等)。CyclicBarrier與CountDownLatch類似,我們在上一篇文章中看到了它,它允許多個線程等待彼此(障礙),然后繼續。 CoundDownLatch和CyclicBarrier之間的區別也是Java中一個非常流行的多線程面試問題 。 CyclicBarrier是并發程序的自然要求,因為一旦單個任務完成,它就可以用于執行任務的最后一部分。 等待彼此到達屏障的所有線程都稱為方,使用要等待的方數初始化CyclicBarrier,然后通過調用CyclicBarrier.await()方法來彼此等待線程,這是Java中的阻塞方法,直到所有線程都阻塞或各方調用await()。 通常,調用await()會喊出Thread正在等待屏障。 await()是一個阻塞調用,但可以被其他線程超時或中斷。 在此Java并發性教程中,我們將看到CyclicBarrier的簡單示例,在該示例上,三個線程將互相等待,然后再繼續操作。
Java中 CountDownLatch CyclicBarrier 之間的區別
在上一篇文章中,我們了解了如何使用CountDownLatch來實現多個相互等待的線程 。 如果您查看CyclicBarrier,它也做同樣的事情,但是有不同之處,一旦計數達到零,您將無法重用 CountDownLatch ,而您可以通過調用reset()方法重用CyclicBarrier來將Barrier重置為其初始狀態。 這意味著CountDownLatch適用于一次事件,例如應用程序啟動時間,而CyclicBarrier可以用于周期性事件,例如同時計算大問題的解決方案等。如果您想了解有關Java中線程和并發性的更多信息,也可以查看我有關何時在Java中使用Volatile變量以及Java 如何同步的文章 。
Java中的 CyclicBarrier –示例
這是Java中CyclicBarrier的一個簡單示例,在該示例中,我們使用3個方初始化了CyclicBarrier,這意味著為了越過障礙,3個線程需要調用await()方法。 每個線程都在短時間內調用await方法,但是直到所有3個線程都到達障礙為止,它們才繼續進行,一旦所有線程到達障礙,障礙都獲得代理,并且每個線程從此處開始執行。 通過以下CyclicBarrier示例在Java中的輸出,可以很清楚地看到它:
import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;
import java.util.logging.Level;
import java.util.logging.Logger;/**
* Java program to demonstrate how to use CyclicBarrier in Java. CyclicBarrier is a 
* new Concurrency Utility added in Java 5 Concurrent package.
*
* @author Javin Paul
*/public class CyclicBarrierExample {//Runnable task for each thread
private static class Task implements Runnable {private CyclicBarrier barrier;public Task(CyclicBarrier barrier) {
this.barrier = barrier;
}@Override
public void run() {
try {
System.out.println(Thread.currentThread().getName() + " is waiting on barrier");
barrier.await();
System.out.println(Thread.currentThread().getName() + " has crossed the barrier");
} catch (InterruptedException ex) {
Logger.getLogger(CyclicBarrierExample.class.getName()).log(Level.SEVERE, null, ex);
} catch (BrokenBarrierException ex) {
Logger.getLogger(CyclicBarrierExample.class.getName()).log(Level.SEVERE, null, ex);
}
}
}public static void main (String args[]) {//creating CyclicBarrier with 3 parties i.e. 3 Threads needs to call await()
final CyclicBarrier cb = new CyclicBarrier(3, new Runnable(){
@Override
public void run(){
//This task will be executed once all thread reaches barrier
System.out.println("All parties are arrived at barrier, lets play");
}
});//starting each of thread
Thread t1 = new Thread(new Task(cb), "Thread 1");
Thread t2 = new Thread(new Task(cb), "Thread 2");
Thread t3 = new Thread(new Task(cb), "Thread 3");t1.start();
t2.start();
t3.start();}
}

輸出:

Thread 1 is waiting on barrier
Thread 3 is waiting on barrier
Thread 2 is waiting on barrier
All parties are arrived at barrier, lets play
Thread 3 has crossed the barrier
Thread 1 has crossed the barrier
Thread 2 has crossed the barrier
何時 在Java中 使用 CyclicBarrier
鑒于CyclicBarrier的性質, 與Java 7的fork-join框架類似,實現map reduce任務非常方便,在Java 7中 ,將大任務分解為較小的部分,并完成需要從單個小任務輸出的任務,例如要計算印度的人口,您可以有4個線程來計算北,南,東和西的人口,完成后它們可以互相等待,當最后一個線程完成任務時,主線程或任何其他線程可以從每個區域中添加結果并打印總人口。 您可以在Java中使用CyclicBarrier:
1)實現多人游戲,直到所有玩家都加入后才能開始。
2)通過將其分解為較小的單個任務來執行冗長的計算,通常要實施Map reduce技術。
Java CyclicBarrier的 重點
1.一旦所有線程到達barrier,CyclicBarrier即可執行完成任務,可以在創建CyclicBarrier時提供。
2.如果用3個參與者初始化了CyclicBarrier,則意味著3個線程需要調用await方法來打破該障礙。
3. 線程將在await()上阻塞 ,直到各方到達障礙,另一個線程中斷或等待超時為止。
4.如果另一個線程中斷正在等待屏障的線程,它將拋出BrokernBarrierException,如下所示:
java.util.concurrent.BrokenBarrierException
at java.util.concurrent.CyclicBarrier.dowait(CyclicBarrier.java:172)
at java.util.concurrent.CyclicBarrier.await(CyclicBarrier.java:327)
5. CyclicBarrier .reset()將Barrier置于其初始狀態,正在等待或尚未達到屏障的其他線程將以java.util.concurrent.BrokenBarrierException終止。
以上就是Java中帶有示例的CyclicBarrier。 我們還看到了Java中CountDownLatch和CyclicBarrier之間的區別,并且了解了一些可以在Java并發代碼中使用CyclicBarrier的想法。

參考: Javarevisited博客上的JCG合作伙伴 Javin Paul提供的Java 5中的CyclicBarrier示例–并發教程 。


翻譯自: https://www.javacodegeeks.com/2012/08/java-concurrency-cyclicbarrier-example.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/372185.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/372185.shtml
英文地址,請注明出處:http://en.pswp.cn/news/372185.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

java i o總結_Java I/O 總結

一、IO流的三種分類方式1.按流的方向分為:輸入流和輸出流2.按流的數據單位不同分為:字節流和字符流3.按流的功能不同分為:節點流和處理流二、IO流的四大抽象類:字符流:Reader Writer字節流:InputStream(讀數…

try...catch 語句

一般情況下,我們很少用到 try...catch 語句,但是有時候為了測試代碼中的錯誤,也有可能會用到。小白我也在工作中用到過。那么好的程序設計,什么時候會用到呢? try...catch 一般用來捕獲宿主對象或者ECMAScript拋出的異…

用Mockito回答

在編寫單元測試時 ,必須牢記不要依賴外部組件。 為了避免這種情況,我們使用了模擬框架,對我來說,最容易使用的是Mockito 。 在本文中,我們將看到在Mockito中使用的一種“高級”技術,可以使用Answer接口在模…

java三板斧_Java 枚舉使用三板斧

Java 枚舉使用三板斧1 定義public enum CountryEnums {ONE(1,"韓"),TWO(2,"魏"),THREE(3,"楚"),FOUR(4,"燕"),FIVE(5,"趙"),SIX(6,"齊");private Integer retCode;private String retMsg;// 枚舉的構造方法是 pri…

假裝這些是MyEclipse的快捷鍵(1)

Java快捷鍵 Alt / 代碼自動補全Alt Shift S 功能菜單 Ctrl 1 代碼自動修正Ctrl / 單行注釋/取消Ctrl O 查看類的所有方法Ctrl T 查看類的集成架構圖Ctrl Shift / 多行注釋Ctrl Shift \ 取消多行注釋Ctrl Shift F 代碼格式化轉載于:https://www.cnblogs.com/swordt…

JasperReports JSF插件用例–簡單列表報告

這是JasperReports JSF插件系列的第一篇“用例文章” ,我將專注于一個簡單的需求,并且我將進一步深入。 起點是我們已經為圖書商店完成的項目設置,我將向其中添加一個列表,其中包含在數據庫中注冊的其他圖書,該列表也將…

2016.10.17先占坑

2016.10.17先占坑轉載于:https://www.cnblogs.com/amurzet/p/5978986.html

ER圖流程圖

ER圖:ER圖分為實體、屬性、關系三個核心部分。實體是長方形體現,而屬性則是橢圓形,關系為菱形。 圖書館管理系統流程圖(圖片源于網上):對于程序員來說,我們要知道:整個系統中&#x…

php源碼仿三一重工,織夢仿三一重工業大學氣企業網站php源碼

★模板引薦★源碼稱呼:仿三一重工業大學氣企業網站php源碼仿三一重工業大學氣企業網站php源碼,嘗試完備無錯,兼容合流欣賞器。模板包括安置證明,并包括嘗試數據。本模板鑒于DEDECms 5.7 GBK安排,須要 UTF-8版本的請本人…

接觸Jenkins(Hudson)API,第2部分

這篇文章從本教程的第1部分繼續。 已經快一年了,但是我終于有時間重新審視我為與Jenkins api交互而編寫的一些代碼。 我已經使用了部分工作來幫助管理許多Jenkins構建服務器,主要是保持插件同步以及將作業從一臺機器移動到另一臺機器。 在本文中&#xf…

php樹莓派魔鏡,用樹莓派和顯示器制作一面“魔鏡”

所需要的材料一臺顯示器一塊和顯示器大小相同的雙面鏡一些2*4米的細木條樹莓派機器必要組件(電源、HDMI線、usb無線網卡、鍵盤)木工工具(鋸子、磨砂機、螺絲刀)螺絲、液態釘子選一個合適的顯示器鏡子的大小完全由顯示器的類型和大小決定,所以我希望得到一個盡量大的…

【數字圖像處理】[3]--直方圖規范化

【數字圖像處理】[3]--直方圖規范化直方圖規范化出現的原因是因為直方圖均衡只能產生出固定的圖像,不滿足于需求,有時我們需要讓直方圖變成特定的直方圖,于是有了直方圖規范化原理:可能只看公式沒什么感覺,我們來舉一個…

JavaFX 2.0布局窗格– GridPane

毫無疑問, GridPane是JavaFX 2.0中功能最強大,最靈活的布局窗格。 它在由行和列組成的靈活網格中布置其子項,與Swing的GridBagLayout或HTML的表格模型非常相似。 這種方法使該窗格非常適合于任何形式的表單(例如網站上的聯系表單&…

leecode 題解 || Merge k Sorted Lists 問題

problem: Merge k sorted linked lists and return it as one sorted list.Analyze and describe its complexity.Tags Divide and Conquer Linked List Heap合并K個已序單鏈表 thinking: (1)題目沒有要求不能夠新開ListNode,所以…

PHP在瀏覽器中被拒絕請求,php控制請求頁面瀏覽器緩

緩存的主要作用是防止用戶頻繁刷新網站頁面,導致服務器數據庫負擔,既要保證信息更新的及時性,也要保證緩存能被充分利用。http協議里控制瀏覽器緩存的頭有三個Cache-Control,Expires,Last-Modified,在PHP下…

js -03課 -03 js中的真假判斷

真假的問題:數據類型-數字(NaN)、字符串、布爾、函數、對象(elem、[]、{}、null)、未定義真:非0的數字、非空字符串、true、函數、能找到的元素、[]、{}假:0、NaN、空字符串、false、不能找到的…

HBASE啟動失敗,Failed construction of Master: class org.apache.hadoop.hbase.master.HMaster

Master日志錯誤:2015-12-02 06:34:32,394 ERROR [main] master.HMasterCommandLine: Master exitingjava.lang.RuntimeException: Failed construction of Master: class org.apache.hadoop.hbase.master.HMasterat org.apache.hadoop.hbase.master.HMaster.constru…

Java線程:我應該創建幾個

介紹 “我應該創建多少個線程?”。 許多年前,我的一個朋友問我這個問題,然后我按照“ CPU核心數 1”的指示給了他答案。 當您在這里閱讀時,大多數人都在點頭。 不幸的是,我們所有人當時都錯了。 現在,如果您…

java ui自動化測試腳本,如何用Airtest編寫UI自動化腳本(示例代碼)

前言游戲并不像app一樣直接把渲染樹節點暴露出來,這就造成游戲UI自動化在元素定位上的不方便性,不過依賴airtest的圖片識別,我們可以直接跳過元素檢查,以圖片對比的形式進行自動化,雖然效率可能會低一些,但…

Spring JDBC數據庫連接池設置

對于任何Java應用程序而言, 在Spring框架中設置JDBC數據庫連接池都是很容易的,僅需更改spring配置文件中的一些配置即可。使用Apache Commons DBCP和Commons Pool以及Spring框架的連接池是不錯的選擇,但是如果您擁有Web服務器和托管的J2EE容器…