import java.util.concurrent.BrokenBarrierException; import java.util.concurrent.CountDownLatch; import java.util.concurrent.CyclicBarrier; /** * 文件功能:CyclicBarrier 多線程線程協調輔助工具 * 故事,一個班5個士兵同時端槍射擊 * Created */ public class CyclicBarrierSample { static CyclicBarrier cyclBr=new CyclicBarrier(5, new Runnable() { @Override public void run() { System.out.println("聽班長口令,開始射擊----"); } }); public static void main(String args[]){ for(int i=0;i<=4;i++){ new MyThread2("A班士兵"+i,cyclBr).start(); } try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("B班開始準備射擊(重複使用CyclicBarrier)************"); for(int i=0;i<=4;i++){ new MyThread2("B班士兵"+i,cyclBr).start(); } } } class MyThread2 extends Thread{ CyclicBarrier cyclBr; public MyThread2(String name,CyclicBarrier cyclBr){ super(name); this.cyclBr=cyclBr; } public void run() { System.out.println(Thread.currentThread().getName()+"端槍,準備好..." ); try { cyclBr.await(); } catch (InterruptedException e) { e.printStackTrace(); } catch (BrokenBarrierException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName()+"射擊>>>>>>"); } }
預期輸出:java
A班士兵1端槍,準備好...
A班士兵2端槍,準備好...
A班士兵3端槍,準備好...
A班士兵0端槍,準備好...
A班士兵4端槍,準備好...
聽班長口令,開始射擊----
A班士兵4射擊>>>>>>
A班士兵1射擊>>>>>>
A班士兵2射擊>>>>>>
A班士兵3射擊>>>>>>
A班士兵0射擊>>>>>>
B班開始準備射擊(重複使用CyclicBarrier)************
B班士兵0端槍,準備好...
B班士兵2端槍,準備好...
B班士兵4端槍,準備好...
B班士兵3端槍,準備好...
B班士兵1端槍,準備好...
聽班長口令,開始射擊----
B班士兵1射擊>>>>>>
B班士兵0射擊>>>>>>
B班士兵2射擊>>>>>>
B班士兵4射擊>>>>>>
B班士兵3射擊>>>>>>多線程
import java.util.Random; import java.util.concurrent.CountDownLatch; /** * 文件功能:CountDownLatch 多線程計數同步工具 * Created * 故事,一個班裏5個兵緊急集合。 * 模擬 集合時間統計。 */ public class CountDownLatchSample { static CountDownLatch bugleCall=new CountDownLatch(1);//吹響集結號 static CountDownLatch assemblied=new CountDownLatch(5);//集結完畢 public static void main(String[] args){ for(int i=0;i<5;i++){ new Thread(new Soldier("士兵"+i,bugleCall,assemblied)).start(); try { Thread.sleep(1000);//等1s都睡下了吧 } catch (InterruptedException e) { e.printStackTrace(); } } System.out.println("班長吹響集結號--------------"); Long startTime=System.currentTimeMillis(); bugleCall.countDown(); try { assemblied.await(); System.out.println("集結完畢,本次集結耗時:【"+(System.currentTimeMillis()-startTime)/1000+"】秒。"); } catch (InterruptedException e) { e.printStackTrace(); } } } class Soldier implements Runnable{ CountDownLatch listen;//聽號聲集合 CountDownLatch report;//集結完畢,報告 String name; public Soldier(String name,CountDownLatch listen,CountDownLatch report){ this.listen=listen; this.name=name; this.report=report; } @Override public void run() { try { System.out.println(this.name + "正在作好夢。。。"); listen.await(); System.out.println(this.name + "聽到號聲,開始起牀集合。"); Thread.sleep(new Random().nextInt(5000));//隨機延時5秒引內 System.out.println(this.name + "集合完畢。"); } catch (InterruptedException e) { e.printStackTrace(); }finally { report.countDown(); } } }
預期輸出:dom
士兵0正在作好夢。。。
士兵1正在作好夢。。。
士兵2正在作好夢。。。
士兵3正在作好夢。。。
士兵4正在作好夢。。。
班長吹響集結號--------------
士兵0聽到號聲,開始起牀集合。
士兵3聽到號聲,開始起牀集合。
士兵2聽到號聲,開始起牀集合。
士兵1聽到號聲,開始起牀集合。
士兵4聽到號聲,開始起牀集合。
士兵3集合完畢。
士兵0集合完畢。
士兵4集合完畢。
士兵2集合完畢。
士兵1集合完畢。
集結完畢,本次集結耗時:【2】秒。ide