最近在整理 Java 的多线程相关的技术,这里备份下关于【 CyclicBarrier 】代码。CyclicBarrier主要是用来在各个线程间进行等待的工具。
github:
【 https://github.com/cstriker1407/think_in_java 】
CONTENTS
CyclicBarrierTest.java类:
public class CyclicBarrierTest { public static void test() { final CyclicBarrier barrer = new CyclicBarrier(3, new Runnable() { @Override public void run() { System.out.println("The players have arrived pos"); } }); new Player(barrer, "player1").start(); new Player(barrer, "player2").start(); new Player(barrer, "player3").start(); } } class Player extends Thread { public Player(CyclicBarrier barrer, String name) { super(); this.barrer = barrer; this.name = name; } private CyclicBarrier barrer; private String name; @Override public void run() { try { Thread.sleep(new Random().nextInt(5)); } catch (InterruptedException e) { e.printStackTrace(); } try { System.out.println("player:"+ name + " is Arriving Pos1"); barrer.await(); } catch (Exception e) { e.printStackTrace(); } System.out.println("player:"+ name + " is go on"); try { Thread.sleep(new Random().nextInt(5)); } catch (InterruptedException e) { e.printStackTrace(); } try { System.out.println("player:"+ name + " is Arriving Pos2"); barrer.await(); } catch (Exception e) { e.printStackTrace(); } System.out.println("player:"+ name + " is finish"); } }
日志打印:
player:player2 is Arriving Pos1 player:player1 is Arriving Pos1 player:player3 is Arriving Pos1 The players have arrived pos player:player3 is go on player:player2 is go on player:player1 is go on player:player2 is Arriving Pos2 player:player1 is Arriving Pos2 player:player3 is Arriving Pos2 The players have arrived pos player:player3 is finish player:player2 is finish player:player1 is finish
备注:
通过日志可以发现,当多个线程的执行进度不一样时,可以利用CyclicBarrier进行统一进度。
发表评论