并发工具类——CyclicBarrier
主要是多个线程,执行await方法,直到等于初始化设置次数时,各个线程才能继续执行,否则就继续等待。
当调用await方法达到初始化之值的时候,还能进行统计的操作。
没有进行统计的代码
public static CyclicBarrier barrier = new CyclicBarrier(4); public static class ActionThread implements Runnable{ @Override public void run() { //获取线程ID long threadId = Thread.currentThread().getId(); try { System.out.println("await before ===="+threadId); barrier.await(); System.out.println("await after ===="+threadId); }catch (Exception e){ } } } public static void main(String[] args) { int i =0; while (i<4){ i++; new Thread(new ActionThread()).start(); } }
运行结果:
await before ====11
await before ====14
await before ====12
await before ====13
await after ====13
await after ====11
await after ====14
await after ====12
需要统计的代码
public static CyclicBarrier barrier = new CyclicBarrier(4, new CountThread());//加入的统计线程 //保存记录的数据 public static ArrayList list = new ArrayList(); public static class CountThread implements Runnable{ @Override public void run() { System.out.println(Arrays.toString(list.toArray())); } } public static class ActionThread implements Runnable{ @Override public void run() { //获取线程ID long threadId = Thread.currentThread().getId(); try { list.add(threadId); System.out.println("await before ===="+threadId); barrier.await(); System.out.println("await after ===="+threadId); }catch (Exception e){ } } } public static void main(String[] args) { int i =0; while (i<4){ i++; new Thread(new ActionThread()).start(); } }
执行结果
await before ====12
await before ====14
await before ====13
await before ====11
[12, 14, 13, 11]
await after ====11
await after ====12
await after ====14
await after ====13
注:await方法是可以重复调用的。会重复执行调用统计的线程CountThread

浙公网安备 33010602011771号