多線程任務-迴環柵欄-線程計數器-信號量

1、迴環柵欄-CyclicBarrier

一、定義
  • 初始化時標記線程數,當啓動的線程數達到標記線程數,則併發執行。使全部線程保持同一狀態併發。
二、場景
  • 適合須要線程相互等待對方完成時,好比多線程計算,在對計算結果進行彙總。
三、代碼

運行順序:建立線程並啓動,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]聚合後同步執行
複製代碼

2、線程計數器-CountDownLatch

一、定義
  • 初始化標記次數,await可以使當前線程阻塞,調用countDown使標記次數減1,當標記次數爲0時,喚醒阻塞的線程。可等待其餘線程執行完畢在執行。
二、場景
  • 適合在主線程須要等待子線程執行完畢後在執行或者須要等待某些資源的時候。
三、代碼
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]繼續
複製代碼

3、信號量-Semaphore

控制某一資源同時訪問的線程數多線程

相關文章
相關標籤/搜索