這篇文章將為大家詳細講解有關java并發(fā)之同步輔助類CyclicBarrier的示例分析,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。
站在用戶的角度思考問題,與客戶深入溝通,找到尚志網(wǎng)站設計與尚志網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗,讓設計與互聯(lián)網(wǎng)技術結(jié)合,創(chuàng)造個性化、用戶體驗好的作品,建站類型包括:網(wǎng)站設計、成都網(wǎng)站建設、企業(yè)官網(wǎng)、英文網(wǎng)站、手機端網(wǎng)站、網(wǎng)站推廣、申請域名、網(wǎng)站空間、企業(yè)郵箱。業(yè)務覆蓋尚志地區(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<Result> result;
private int row;
private int searchNmu;
public Searcher(int[] submock, List<Result> result, CyclicBarrier barrier, int row, int searchNmu) {
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<submock.length; 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<Result> result;
int[][] mock;
public Grouper(List<Result> result, int[][] mock) {
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<Result> result = new ArrayList<Result>();
// 匯總線程
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");
}
}
需要注意的地方
線程完成任務后調(diào)用CyclicBarrier的await()方法休眠等待。在所有線程在集合點均到達時,柵欄調(diào)用傳入的Runnable對象進行最后的執(zhí)行。
與CountDownLatch的區(qū)別:
在所有線程到達集合點后接受一個Runnable類型的對象作為后續(xù)的執(zhí)行
沒有顯示調(diào)用CountDown()方法
CountDownLatch一般只能使用一次,CyclicBarrier可以多次使用
應用場景
多個線程做任務,等到達集合點同步后交給后面的線程做匯總
關于“java并發(fā)之同步輔助類CyclicBarrier的示例分析”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。
網(wǎng)站標題:java并發(fā)之同步輔助類CyclicBarrier的示例分析
網(wǎng)址分享:http://www.muchs.cn/article44/pieehe.html
成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供App開發(fā)、建站公司、響應式網(wǎng)站、網(wǎng)站排名、外貿(mào)建站、網(wǎng)站維護
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)