1.CountDownLatch
package Thread; import java.util.concurrent.CountDownLatch; /** * @author 犀角 * @date 2019/11/1 15:10 * @description */ public class CountDownLatchTest { public static void main(String[] args) throws InterruptedException { CountDownLatch countDownLatch = new CountDownLatch(5); for (int i = 0;i <5; i ++){ new Thread(new readNum(i,countDownLatch)).start(); } countDownLatch.await(); System.out.println("线程执行结束。。。。"); } static class readNum implements Runnable{ private int id; private CountDownLatch latch; public readNum(int id,CountDownLatch latch){ this.id = id; this.latch = latch; } @Override public void run() { synchronized (this){ System.out.println("id:" +id); latch.countDown(); System.out.println("线程组任务"+id + "结束,其他任务继续"); } } } }线程在countDown()之后,会继续执行自己的任务,而CyclicBarrier会在所有线程任务结束之后,才会进行后续任务,具体可以看下面例子。
2.CyclicBarrier
package Thread; import java.util.concurrent.BrokenBarrierException; import java.util.concurrent.CyclicBarrier; /** * @author 犀角 * @date 2019/11/1 15:17 * @description */ public class CyclicBarrierTest { public static void main(String[] args) { CyclicBarrier cyclicBarrier = new CyclicBarrier(5, new Runnable() { @Override public void run() { System.out.println("线程组执行结束"); } }); for (int i = 0;i<5;i++){ new Thread(new readNum(i,cyclicBarrier)).start(); } //CyclicBarrier 可以重复利用, // 这个是CountDownLatch做不到的 // for (int i = 11; i < 16; i++) { // new Thread(new readNum(i,cyclicBarrier)).start(); // } } } class readNum implements Runnable { private int id; private CyclicBarrier cyc; public readNum(int id, CyclicBarrier cyc) { this.id = id; this.cyc = cyc; } @Override public void run() { synchronized (this) { System.out.println("id:" + id); try { cyc.await(); System.out.println("线程组任务" + id + "结束,其他任务继续"); } catch (InterruptedException e) { e.printStackTrace(); } catch (BrokenBarrierException e) { e.printStackTrace(); } } } }