Java騷操作之CountDownLatch代碼詳解

簡述

用來幹嘛的?當你在方法中調用瞭多個線程,對數據庫進行瞭一些不為人知的操作後,還有一個操作需要留到前者都執行完的重頭戲,就需要用到 CountDownLatch

實踐代碼

package com.github.gleans;

import java.util.concurrent.CountDownLatch;

public class TestCountDownLatch {

  public static void main(String[] args) throws InterruptedException {
    CountDownLatch latch = new CountDownLatch(3);
    new KeyPass(1000L, "thin jack", latch).start();
    new KeyPass(2000L, "noral jack", latch).start();
    new KeyPass(3000L, "fat jack", latch).start();
    latch.await();
    System.out.println("此處對數據庫進行最後的插入操作~");
  }

  static class KeyPass extends Thread {

    private long times;

    private CountDownLatch countDownLatch;

    public KeyPass(long times, String name, CountDownLatch countDownLatch) {
      super(name);
      this.times = times;
      this.countDownLatch = countDownLatch;
    }

    @Override
    public void run() {
      try {
        System.out.println("操作人:" + Thread.currentThread().getName()
            + "對數據庫進行插入,持續時間:" + this.times / 1000 + "秒");
        Thread.sleep(times);
        countDownLatch.countDown();
      } catch (InterruptedException e) {
        e.printStackTrace();
      }
    }
  }
}

圖解

圖解

使用await()提前結束操作

package com.github.gleans;

import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;

public class TestCountDownLatch {

  public static void main(String[] args) throws InterruptedException {
    CountDownLatch latch = new CountDownLatch(3);
    new KeyPass(2000L, "公司一", latch).start();
    new KeyPass(3000L, "公司二", latch).start();
    new KeyPass(5000L, "公司三", latch).start();
    latch.await(2, TimeUnit.SECONDS);
    System.out.println("~~~賈總PPT巡演~~~~");
    System.out.println("~~~~融資完成,撒花~~~~");
  }

  static class KeyPass extends Thread {

    private long times;

    private CountDownLatch countDownLatch;

    public KeyPass(long times, String name, CountDownLatch countDownLatch) {
      super(name);
      this.times = times;
      this.countDownLatch = countDownLatch;
    }

    @Override
    public void run() {
      try {
        Thread.sleep(times);
        System.out.println("負責人:" + Thread.currentThread().getName()
            + "開始工作,持續時間:" + this.times / 1000 + "秒");
        countDownLatch.countDown();
      } catch (InterruptedException e) {
        e.printStackTrace();
      }
    }
  }
}

假設公司一、公司二、公司三各需要2s、3s、5s來完成工作,賈總等不瞭,隻能等2s,那麼就設置await的超時時間

latch.await(2, TimeUnit.SECONDS);

執行結果

負責人:公司一開始工作,持續時間:2秒
~~~賈總PPT巡演~~~~
~~~~融資完成,撒花~~~~
負責人:公司二開始工作,持續時間:3秒
負責人:公司三開始工作,持續時間:5秒

方法描述

方法描述

總結

這個操作可以說是簡單好用,目前還未遇見副作用,若是有大佬,可以告知弟弟一下,提前表示感謝~

到此這篇關於Java騷操作之CountDownLatch的文章就介紹到這瞭,更多相關Java CountDownLatch內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: