溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

java并發(fā)之同步輔助類CyclicBarrier的示例分析

發(fā)布時間:2021-12-16 17:33:30 來源:億速云 閱讀:149 作者:小新 欄目:大數(shù)據(jù)

這篇文章將為大家詳細(xì)講解有關(guān)java并發(fā)之同步輔助類CyclicBarrier的示例分析,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。

CyclicBarrier含義:

柵欄允許兩個或者多個線程在某個集合點同步。當(dāng)一個線程到達(dá)集合點時,它將調(diào)用await()方法等待其它的線程。線程調(diào)用await()方法后,CyclicBarrier將阻塞這個線程并將它置入休眠狀態(tài)等待其它線程的到來。等最后一個線程調(diào)用await()方法時,CyclicBarrier將喚醒所有等待的線程然后這些線程將繼續(xù)執(zhí)行。CyclicBarrier可以傳入另一個Runnable對象作為初始化參數(shù)。當(dāng)所有的線程都到達(dá)集合點后,CyclicBarrier類將Runnable對象作為線程執(zhí)行。

方法

await():使線程置入休眠直到最后一個線程的到來之后喚醒所有休眠的線程

例子

在矩陣(二維數(shù)組)中查找一個指定的數(shù)字。矩陣將被分為多個子集,每個子集交給一個線程去查找。當(dāng)所有線程查找完畢后交給最后的線程匯總結(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");

}

}

需要注意的地方

線程完成任務(wù)后調(diào)用CyclicBarrier的await()方法休眠等待。在所有線程在集合點均到達(dá)時,柵欄調(diào)用傳入的Runnable對象進(jìn)行最后的執(zhí)行。

與CountDownLatch的區(qū)別:

  • 在所有線程到達(dá)集合點后接受一個Runnable類型的對象作為后續(xù)的執(zhí)行

  • 沒有顯示調(diào)用CountDown()方法

  • CountDownLatch一般只能使用一次,CyclicBarrier可以多次使用

應(yīng)用場景

多個線程做任務(wù),等到達(dá)集合點同步后交給后面的線程做匯總

關(guān)于“java并發(fā)之同步輔助類CyclicBarrier的示例分析”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,使各位可以學(xué)到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI