【JUC】CountDownLatch你真的瞭解嗎?

背景

在平時的開發中,我們如何讓各個線程間協調工作呢?
除了我們經常使用的線程同步鎖Sychronized,ReentrantLOcak的使用,還有線程自有方法,sleep,yeid的使用。哪還有那些高級的使用呢?那就是JUC包中的CountDownLatch,CyclicBarrier,Semaphore。今天我們先了解一下CountDownLatch的使用。

CountDownLatch

1. 權威指南

  • 一種同步幫助,允許一個或多個線程等待,直到其他線程中執行的一組操作完成爲止。
    一個CountDownLatch初始化爲給定數。該await方法將阻塞,直到由於該countDown()方法的調用導致當前計數達到零爲止,此後所有等待線程被釋放,並且隨後的所有awaitreturn 調用都將立即釋放 。這是一種一次性現象-無法重置計數。如果您需要用於重置計數的版本,請考慮使用CyclicBarrier。
  • 類介紹
    在這裏插入圖片描述

2. 代碼演示

package JUC;

import lombok.Data;
import lombok.SneakyThrows;
import org.omg.PortableServer.THREAD_POLICY_ID;

import java.util.concurrent.CountDownLatch;

/**
 * @authoryuanxindong
 * @date: 2020/6/16 10:18 下午
 */
public class CountDownLatchDemo implements Runnable{
    private static final  int DownLatchCount = 3;
    private  int  timeOut;
    public CountDownLatchDemo(int timeOut){
        this.timeOut = timeOut;
    }

   static final CountDownLatch latch = new CountDownLatch(DownLatchCount);
    public static void main(String[] args) {
        // 創建多個線程,且每個線程的sleep的時間是不一致的
        CountDownLatchDemo countDownLatchDemo = new CountDownLatchDemo(1000);
        Thread thread = new Thread(countDownLatchDemo);
        CountDownLatchDemo countDownLatchDemov2 = new CountDownLatchDemo(3000);
        Thread thread1 =new  Thread(countDownLatchDemov2);
        CountDownLatchDemo countDownLatchDemov3 = new CountDownLatchDemo(4000);
        Thread thread2 =new  Thread(countDownLatchDemov3);
        long start = System.currentTimeMillis();
        thread.start();
        thread1.start();
        thread2.start();

        try {
            System.out.println("等待"+DownLatchCount+"個子線程執行完畢...");
            latch.await();
            System.out.println(DownLatchCount+"個子線程已經執行完畢");
            long time = System.currentTimeMillis()-start;
            System.out.println("time:"+ time);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    @SneakyThrows
    @Override
    public void run() {
        Thread.sleep(timeOut);
        System.out.println("yuanxindongO"+Thread.currentThread().getName());
        latch.countDown();
    }
}


  • 通過啓用三個線程,然後給每個線程一個運行時間通過sleep來控制。分別是1000和3000和4000
  • countDownLatch的作用是可以等待所有線程達到執行初始定義的次數,就可以釋放阻塞,接着完成主線程。
  • 執行結果:
    在這裏插入圖片描述

總結

  • 允許一個或多個線程等待某些操作完成(完美!!!!)

參考資料

  • https://docs.oracle.com/javase/9/docs/api/java/util/concurrent/CountDownLatch.html
  • https://time.geekbang.org/column/article/9373
  • https://www.cnblogs.com/dolphin0520/p/3920397.html
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章