public class CycleBarrierTestl {
private static CyclicBarrier a = new CyclicBarrier(2, new Runnable() {
@Override
public void run() {
System.out.println(" 任务完成阶段执行 " + Thread.currentThread());
}
});
public static void main(String[] args) throws InterruptedException {
ExecutorService executorService = Executors.newFixedThreadPool(2);
executorService.submit(new Runnable() {
@Override
public void run() {
System.out.println(" main方法线程池1 " + Thread.currentThread());
try {
a.await();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (BrokenBarrierException e) {
e.printStackTrace();
}
System.out.println(" main方法线程池1执行完成 " + Thread.currentThread());
System.out.println(" main方法线程池1第二阶段开始执行 " + Thread.currentThread());
try {
a.await();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (BrokenBarrierException e) {
e.printStackTrace();
}
System.out.println(" main方法线程池1第二阶段完成执行 " + Thread.currentThread());
}
});
executorService.submit(new Runnable() {
@Override
public void run() {
System.out.println(" main方法线程池2 " + Thread.currentThread());
try {
a.await();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (BrokenBarrierException e) {
e.printStackTrace();
}
System.out.println(" main方法线程池2执行完成 " + Thread.currentThread());
System.out.println(" main方法线程池2第二阶段开始执行 " + Thread.currentThread());
try {
a.await();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (BrokenBarrierException e) {
e.printStackTrace();
}
System.out.println(" main方法线程池2第二阶段完成执行 " + Thread.currentThread());
}
});
Thread.sleep(10000L);
executorService.shutdown();
}
}
运行结果:
main方法线程池1 Thread[pool-1-thread-1,5,main]
main方法线程池2 Thread[pool-1-thread-2,5,main]
任务完成阶段执行 Thread[pool-1-thread-2,5,main]
main方法线程池2执行完成 Thread[pool-1-thread-2,5,main]
main方法线程池2第二阶段开始执行 Thread[pool-1-thread-2,5,main]
main方法线程池1执行完成 Thread[pool-1-thread-1,5,main]
main方法线程池1第二阶段开始执行 Thread[pool-1-thread-1,5,main]
任务完成阶段执行 Thread[pool-1-thread-1,5,main]
main方法线程池1第二阶段完成执行 Thread[pool-1-thread-1,5,main]
main方法线程池2第二阶段完成执行 Thread[pool-1-thread-2,5,main]
CountDownLatch与CyclicBarrier比较
- 相同地方都能实现让一组线程全部达到一个状态后再全部同时执行,相比join更加灵活贴合实际使用。
- CountDownLatch只能完成一次多线程同步状态的执行,CyclicBarrier能够完成多次。