原创:转载需注明原创地址 https://www.cnblogs.com/fanerwei222/p/11867687.html
Java线程--CyclicBarrier使用, 代码里头有详细注释:
public static void main(String[] args) { /** * 可循环使用的栅栏 * parties表示需要多少个线程同时执行, 相当于一个起跑线 * 2代表2个线程必须在 await()方法的地方都暂停一下, 等其他人到齐了一起执行 * 第二个参数代表新建一个线程在所有等待的线程方法之前执行 */ CyclicBarrier cyclicBarrier = new CyclicBarrier(2, new Runnable() { @Override public void run() { System.out.println("先执行这个方法!"); } }); ExecutorService service1 = Executors.newSingleThreadExecutor(); service1.execute(new Runnable() { @Override public void run() { try { Thread.sleep(3000); /** * 设定一个起跑点 , 所有设置了await()方法的线程都必须等到这个时候开始执行 * 不能抢跑 */ cyclicBarrier.await(); System.out.println(new Date()); } catch (InterruptedException | BrokenBarrierException e) { e.printStackTrace(); } System.out.println("子线程:"+Thread.currentThread().getName()+"执行"); } }); service1.shutdown(); ExecutorService service2 = Executors.newSingleThreadExecutor(); service2.execute(new Runnable() { @Override public void run() { try { Thread.sleep(3000); /** * 设定一个起跑点 , 所有设置了await()方法的线程都必须等到这个时候开始执行 * 不能抢跑 */ cyclicBarrier.await(); System.out.println(new Date()); } catch (InterruptedException | BrokenBarrierException e) { e.printStackTrace(); } System.out.println("子线程:"+Thread.currentThread().getName()+"执行"); } }); service2.shutdown(); }
打印如下;
先执行这个方法! Fri Nov 15 16:51:14 CST 2019 Fri Nov 15 16:51:14 CST 2019 子线程:pool-1-thread-1执行 子线程:pool-2-thread-1执行