並發編程-concurrent指南-回環柵欄CyclicBarrier
阿新 • • 發佈:2018-12-20
read interrupt over nbsp rup 管理 system star 地址
叫做回環是因為當所有等待線程都被釋放以後,CyclicBarrier可以被重用。
叫做柵欄,大概是描述所有線程被柵欄擋住了,當都達到時,一起跳過柵欄執行,也算形象。我們可以把這個狀態就叫做barrier。 通過CyclicBarrier的await()方法,線程就處於barrier狀態。
字面意思回環柵欄,通過它可以實現讓一組線程等待至某個狀態之後再全部同時執行。
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