這篇文章將為大家詳細講解有關(guān)java并發(fā)之同步輔助類CyclicBarrier的示例分析,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。
站在用戶的角度思考問題,與客戶深入溝通,找到尚志網(wǎng)站設(shè)計與尚志網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗,讓設(shè)計與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個性化、用戶體驗好的作品,建站類型包括:網(wǎng)站設(shè)計、成都網(wǎng)站建設(shè)、企業(yè)官網(wǎng)、英文網(wǎng)站、手機端網(wǎng)站、網(wǎng)站推廣、申請域名、網(wǎng)站空間、企業(yè)郵箱。業(yè)務(wù)覆蓋尚志地區(qū)。
柵欄允許兩個或者多個線程在某個集合點同步。當一個線程到達集合點時,它將調(diào)用await()方法等待其它的線程。線程調(diào)用await()方法后,CyclicBarrier將阻塞這個線程并將它置入休眠狀態(tài)等待其它線程的到來。等最后一個線程調(diào)用await()方法時,CyclicBarrier將喚醒所有等待的線程然后這些線程將繼續(xù)執(zhí)行。CyclicBarrier可以傳入另一個Runnable對象作為初始化參數(shù)。當所有的線程都到達集合點后,CyclicBarrier類將Runnable對象作為線程執(zhí)行。
方法:
await():使線程置入休眠直到最后一個線程的到來之后喚醒所有休眠的線程
例子
在矩陣(二維數(shù)組)中查找一個指定的數(shù)字。矩陣將被分為多個子集,每個子集交給一個線程去查找。當所有線程查找完畢后交給最后的線程匯總結(jié)果。
查找類:在一個子集中查找指定數(shù)字,找到之后把結(jié)果存儲后調(diào)用await()方法置入休眠等待最后一個線程的到來喚醒
import java.util.List;
import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;
public class Searcher implements Runnable {
private CyclicBarrier barrier;
private int[] submock;
private List
private int row;
private int searchNmu;
public Searcher(int[] submock, List
this.barrier = barrier;
this.submock = submock;
this.result = result;
this.row = row;
this.searchNmu = searchNmu;
}
@Override
public void run() {
System.out.printf("%s: Processing lines from %d .\n", Thread.currentThread().getName(), row);
for(int i=0; i if(submock[i] == searchNmu){ Result r = new Result(); r.setRow(row); r.setCol(i); result.add(r); } } System.out.printf("%s: Lines processed.\n", Thread.currentThread().getName()); try { barrier.await(); } catch (InterruptedException e) { e.printStackTrace(); } catch (BrokenBarrierException e) { e.printStackTrace(); } } } 結(jié)果類: public class Result { //行 int row; //列 int col; public int getRow() { return row; } public void setRow(int row) { this.row = row; } public int getCol() { return col; } public void setCol(int col) { this.col = col; } } 匯總類:匯總每個Searcher找到的結(jié)果: import java.util.List; public class Grouper implements Runnable { private List int[][] mock; public Grouper(List this.result = result; this.mock = mock; } @Override public void run() { System.out.printf("Grouper: Processing results...\n"); for (int i = 0; i < result.size(); i++) { Result r = result.get(i); if(r!=null) System.out.println("mock[" + r.row + "][" + r.col + "]" + mock[r.row][r.col]); } System.out.printf("Grouper proccessing end...\n"); } } 主函數(shù),如何把Searcher和Grouper類配合起來呢?? import java.util.ArrayList; import java.util.List; import java.util.concurrent.CyclicBarrier; public class CyclicBarrierMain { public static void main(String[] args) { // 要找的數(shù)據(jù) final int SEARCH = 5; // 矩陣的聲明 int[][] mock = { { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }, { 1, 2, 3, 5, 5, 6, 7, 8, 9, 10 }, { 5, 2, 3, 4, 5, 6, 7, 8, 9, 10 }, { 1, 2, 3, 4, 6, 6, 7, 8, 5, 10 }, { 1, 5, 3, 4, 5, 6, 7, 8, 5, 10 }, { 1, 5, 3, 4, 12, 6, 7, 8, 0, 5 } }; // 查找的線程數(shù) int PARTICIPANTS = mock.length; List // 匯總線程 Grouper grouper = new Grouper(result, mock); // 柵欄,傳入?yún)?shù)含義:線程同步個數(shù),匯總線程 CyclicBarrier barrier = new CyclicBarrier(PARTICIPANTS, grouper); Searcher searchers[] = new Searcher[PARTICIPANTS]; for (int i = 0; i < PARTICIPANTS; i++) { searchers[i] = new Searcher(mock[i], result, barrier, i, SEARCH); Thread thread = new Thread(searchers[i]); thread.start(); } System.out.printf("Main: The main thread has finished.\n"); } } 需要注意的地方 線程完成任務(wù)后調(diào)用CyclicBarrier的await()方法休眠等待。在所有線程在集合點均到達時,柵欄調(diào)用傳入的Runnable對象進行最后的執(zhí)行。 與CountDownLatch的區(qū)別: 在所有線程到達集合點后接受一個Runnable類型的對象作為后續(xù)的執(zhí)行 沒有顯示調(diào)用CountDown()方法 CountDownLatch一般只能使用一次,CyclicBarrier可以多次使用 應(yīng)用場景 多個線程做任務(wù),等到達集合點同步后交給后面的線程做匯總 關(guān)于“java并發(fā)之同步輔助類CyclicBarrier的示例分析”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。
文章題目:java并發(fā)之同步輔助類CyclicBarrier的示例分析
URL分享:http://weahome.cn/article/pieehe.html