運行順序:建立線程並啓動,main函數不阻塞,cb.await();以後阻塞等待標記線程數滿,執行知足添加後的方法,後線程繼續執行。bash
CyclicBarrier cb=new CyclicBarrier(5,()->{
System.out.println(Thread.currentThread()+"全部線程準備完畢,由最後一個線程執行此方法");
System.out.println(Thread.currentThread()+"執行聚合操做");
});
IntStream.range(0,5).forEach(i->{
new Thread(()->{
System.out.println(Thread.currentThread()+"啓動");
try {
System.out.println(Thread.currentThread()+"執行業務邏輯");
cb.await();//通常以後沒有代碼
System.out.println(Thread.currentThread()+"聚合後同步執行");
} catch (InterruptedException e) {
e.printStackTrace();
} catch (BrokenBarrierException e) {
e.printStackTrace();
}
}).start();
});
System.out.println("mainx執行 ");
==== 結果:
mainx執行
Thread[Thread-3,5,main]啓動
Thread[Thread-4,5,main]啓動
Thread[Thread-2,5,main]啓動
Thread[Thread-1,5,main]啓動
Thread[Thread-1,5,main]執行業務邏輯
Thread[Thread-0,5,main]啓動
Thread[Thread-2,5,main]執行業務邏輯
Thread[Thread-4,5,main]執行業務邏輯
Thread[Thread-3,5,main]執行業務邏輯
Thread[Thread-0,5,main]執行業務邏輯
Thread[Thread-0,5,main]全部線程準備完畢,由最後一個線程執行此方法
Thread[Thread-0,5,main]執行聚合操做
Thread[Thread-0,5,main]聚合後同步執行
Thread[Thread-4,5,main]聚合後同步執行
Thread[Thread-2,5,main]聚合後同步執行
Thread[Thread-1,5,main]聚合後同步執行
Thread[Thread-3,5,main]聚合後同步執行
複製代碼
CountDownLatch countThread=new CountDownLatch(5);
IntStream.range(0,5).forEach(i->{
new Thread(()->{
Thread.sleep(1000L);
System.out.println(Thread.currentThread()+"執行邏輯");
countThread.countDown();
}).start();
});
System.out.println(Thread.currentThread()+"等待全部線程完畢");
countThread.await();
System.out.println(Thread.currentThread()+"繼續");
==== 結果:
Thread[main,5,main]等待全部線程完畢
Thread[Thread-3,5,main]執行邏輯
Thread[Thread-0,5,main]執行邏輯
Thread[Thread-4,5,main]執行邏輯
Thread[Thread-1,5,main]執行邏輯
Thread[Thread-2,5,main]執行邏輯
Thread[main,5,main]繼續
複製代碼
控制某一資源同時訪問的線程數多線程