Java 多線程協調工具 CyclicBarrier 與CountDownLatch 學習

CyclicBarrier

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射擊>>>>>>多線程

CountDownLatch

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

相關文章
相關標籤/搜索