java線程并發(fā)cyclicbarrier類(lèi)使用示例
package com.yao;
import java.util.Random;
import java.util.concurrent.CyclicBarrier;
/**
* CyclicBarrier類(lèi)似于CountDownLatch也是個(gè)計(jì)數(shù)器,
* 不同的是CyclicBarrier數(shù)的是調(diào)用了CyclicBarrier.await()進(jìn)入等待的線程數(shù),
* 當(dāng)線程數(shù)達(dá)到了CyclicBarrier初始時(shí)規(guī)定的數(shù)目時(shí),所有進(jìn)入等待狀態(tài)的線程被喚醒并繼續(xù)。
* CyclicBarrier就象它名字的意思一樣,可看成是個(gè)障礙,
* 所有的線程必須到齊后才能一起通過(guò)這個(gè)障礙。
* CyclicBarrier初始時(shí)還可帶一個(gè)Runnable的參數(shù),
* 此Runnable任務(wù)在CyclicBarrier的數(shù)目達(dá)到后,所有其它線程被喚醒前被執(zhí)行。
*/
public class CyclicBarrierTest {
public static class ComponentThread implements Runnable {
CyclicBarrier barrier;// 計(jì)數(shù)器
int ID; // 組件標(biāo)識(shí)
int[] array; // 數(shù)據(jù)數(shù)組
// 構(gòu)造方法
public ComponentThread(CyclicBarrier barrier, int[] array, int ID) {
this.barrier = barrier;
this.ID = ID;
this.array = array;
}
public void run() {
try {
array[ID] = new Random().nextInt(100);
System.out.println("Component " + ID + " generates: " + array[ID]);
// 在這里等待Barrier處
System.out.println("Component " + ID + " sleep...");
barrier.await();
System.out.println("Component " + ID + " awaked...");
// 計(jì)算數(shù)據(jù)數(shù)組中的當(dāng)前值和后續(xù)值
int result = array[ID] + array[ID + 1];
System.out.println("Component " + ID + " result: " + result);
} catch (Exception ex) {
}
}
}
/**
* 測(cè)試CyclicBarrier的用法
*/
public static void testCyclicBarrier() {
final int[] array = new int[3];
CyclicBarrier barrier = new CyclicBarrier(2, new Runnable() {
// 在所有線程都到達(dá)Barrier時(shí)執(zhí)行
public void run() {
System.out.println("testCyclicBarrier run...");
array[2] = array[0] + array[1];
}
});
// 啟動(dòng)線程
new Thread(new ComponentThread(barrier, array, 0)).start();
new Thread(new ComponentThread(barrier, array, 1)).start();
}
public static void main(String[] args) {
CyclicBarrierTest.testCyclicBarrier();
}
}
相關(guān)文章
SpringBoot 鉤子接口的實(shí)現(xiàn)代碼
本文主要介紹了SpringBoot 鉤子接口,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-08-08注冊(cè)中心配置了spring?security后客戶端啟動(dòng)報(bào)錯(cuò)
這篇文章主要為大家介紹了注冊(cè)中心配置了spring?security后客戶端啟動(dòng)報(bào)錯(cuò)問(wèn)題解決,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-07-07java開(kāi)發(fā)使用BigDecimal避坑四則
這篇文章主要為大家介紹了java開(kāi)發(fā)使用BigDecimal的避坑四則,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-07-07MyBatis-Plus+Druid配置及應(yīng)用詳解
這篇文章主要介紹了MyBatis-Plus+Druid配置及應(yīng)用詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-11-11從字節(jié)碼角度解析synchronized和反射實(shí)現(xiàn)原理
這篇文章主要介紹了從字節(jié)碼角度解析synchronized和反射的實(shí)現(xiàn)原理,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-08-08Spring Security實(shí)現(xiàn)微信公眾號(hào)網(wǎng)頁(yè)授權(quán)功能
這篇文章主要介紹了Spring Security中實(shí)現(xiàn)微信網(wǎng)頁(yè)授權(quán),本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-08-08