package com.thread.threadTest;
import jdk.internal.org.objectweb.asm.tree.IntInsnNode;
import javax.xml.transform.Source;
import java.util.Random;
import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
/**
* 同步工具類
* 1.CyclicBarrier:多個線程在不同時刻到達指定集合點後,接着去執行別的任務.
* 到達指定集合點用CyclicBarrier對象的await方法表示。
*
*/
public class CyclicBarrierTest {
public static void main(String[] args) {
ExecutorService executorService = Executors.newCachedThreadPool();
final CyclicBarrier cyclicBarrier = new CyclicBarrier(3);
for(int i=0;i<3;i++){
Runnable runnable = new Runnable() {
@Override
public void run() {
try {
Thread.sleep((long) (Math.random()*10000));
System.out.println("線程"+Thread.currentThread().getName()+"即將到達集合地點一,當前已有"+(cyclicBarrier.getNumberWaiting()+1)+"個已經到達");
cyclicBarrier.await();
Thread.sleep((long) (Math.random()*10000));
System.out.println("線程"+Thread.currentThread().getName()+"即將到達集合地點二,當前已有"+(cyclicBarrier.getNumberWaiting()+1)+"個已經到達");
cyclicBarrier.await();
Thread.sleep((long) (Math.random()*10000));
System.out.println("線程"+Thread.currentThread().getName()+"即將到達集合地點三,當前已有"+(cyclicBarrier.getNumberWaiting()+1)+"個已經到達");
cyclicBarrier.await();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (BrokenBarrierException e) {
e.printStackTrace();
}
}
};
executorService.execute(runnable);
}
executorService.shutdown();
}
}