1. 程式人生 > >並發編程-concurrent指南-回環柵欄CyclicBarrier

並發編程-concurrent指南-回環柵欄CyclicBarrier

read interrupt over nbsp rup 管理 system star 地址

字面意思回環柵欄,通過它可以實現讓一組線程等待至某個狀態之後再全部同時執行。

java.util.concurrent.CyclicBarrier 類是一種同步機制,它能夠對處理一些算法的線程實現同步。換句話講,它就是一個所有線程必須等待的一個柵欄,直到所有線程都到達這裏,然後所有線程才可以繼續做其他事情。

字面意思回環柵欄,通過它可以實現讓一組線程等待至某個狀態之後再全部同時執行。
叫做回環是因為當所有等待線程都被釋放以後,CyclicBarrier可以被重用。
叫做柵欄,大概是描述所有線程被柵欄擋住了,當都達到時,一起跳過柵欄執行,也算形象。我們可以把這個狀態就叫做barrier。 通過CyclicBarrier的await()方法,線程就處於barrier狀態。
CyclicBarrier應用場景例子
10個人跑步,人來全了,等到發令槍槍聲後,開始跑
具體代碼:
import java.util.concurrent.CyclicBarrier;

public class Main {
    public static void main(String[] args) {
        int player_count = 10;//10個參賽選手

        Admin admin = new Admin();//發令槍管理員
        CyclicBarrier cyclicBarrier = new CyclicBarrier(player_count,admin);
        
for(int i = 0;i < 10;i++){ Player player = new Player(cyclicBarrier); new Thread(player).start(); } } }
/**
 * 管理員發令開跑
 */
public class Admin implements Runnable{
    @Override
    public void run() {
        System.out.println("選手已來齊,跑");
    }
}
import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier; /** * 選手 */ public class Player implements Runnable{ private CyclicBarrier cyclicBarrier; public Player(CyclicBarrier cyclicBarrier){ this.cyclicBarrier = cyclicBarrier; } @Override public void run() { System.out.println(Thread.currentThread().getName()+",準備跑"); try { cyclicBarrier.await(); } catch (InterruptedException e) { e.printStackTrace(); } catch (BrokenBarrierException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName()+"開跑"); } }

結果:

Thread-0,準備跑
Thread-1,準備跑
Thread-2,準備跑
Thread-4,準備跑
Thread-3,準備跑
Thread-5,準備跑
Thread-6,準備跑
Thread-7,準備跑
Thread-8,準備跑
Thread-9,準備跑
選手已來齊,跑
Thread-1開跑
Thread-0開跑
Thread-4開跑
Thread-7開跑
Thread-2開跑
Thread-9開跑
Thread-8開跑
Thread-6開跑
Thread-5開跑
Thread-3開跑

源碼地址:https://github.com/qjm201000/concurrent_cyclicBarrier.git

並發編程-concurrent指南-回環柵欄CyclicBarrier