1. 程式人生 > 實用技巧 >java基礎----CountDownLatch、Enum

java基礎----CountDownLatch、Enum

  CountDownLatch是juc包裡面的一個計數器,使用者可以為他設定一個初始值,並呼叫他的await()方法使當前執行緒轉變為阻塞狀態,直到CountDownLatch計數完畢。

  Enum是java中的列舉,當程式執行過程中需要根據一定的對應關係去獲取一些資料的時候,通過資料庫去拿這些資料是非常消耗效能的,因為中間有建立和銷燬資料庫連線的消耗,因此,可以用列舉來實現這些功能。

  下面通過一個例子來理解這兩個東西

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

public class CountDownLatchDemo {
    public static void main(String[] args) throws InterruptedException {
        CountDownLatch countDownLatch = new CountDownLatch(6);
        Random rd = new Random();

        System.out.println(Thread.currentThread().getName() + "執行緒開始");
        for(int i = 0; i < 6; i++)
        {
            new Thread(()->{
                try {
                    System.out.println(Thread.currentThread().getName() + "執行緒開始");
                    TimeUnit.SECONDS.sleep(rd.nextInt(5));
                    System.out.println(Thread.currentThread().getName() + "執行緒結束");
                    countDownLatch.countDown();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            },ThreadEnum.getThreadNameByKey(i).getRetMessage()).start();
        }

        countDownLatch.await();
        System.out.println(Thread.currentThread().getName() + "執行緒結束");
    }
}

  在上述程式碼中,我們希望main執行緒在所有子執行緒都結束後才結束,因此在main執行緒中加入了countDownLatch.awati()方法,而每個子執行緒結束的時候,都會讓countDownLatch - 1。值得一提的是,在獲取執行緒名的時候,程式碼裡面使用了列舉的方式去獲取,ThreadEnum.getThreadNameByKey(i).getRetMessage()。列舉具體的程式碼如下:

import jdk.nashorn.internal.objects.annotations.Getter;

public enum ThreadEnum {
    ONE(0,"a"),
    TWO(1,"b"),
    THREE(2,"c"),
    FOUR(3,"d"),
    FIVE(4,"e"),
    SIX(5,"f");

    private Integer retCode;
    private String retMessage;

    public Integer getRetCode() {
        return retCode;
    }

    public void setRetCode(Integer retCode) {
        this.retCode = retCode;
    }

    public String getRetMessage() {
        return retMessage;
    }

    public void setRetMessage(String retMessage) {
        this.retMessage = retMessage;
    }

    ThreadEnum(Integer retCode, String retMessage)
    {
        this.retCode = retCode;
        this.retMessage = retMessage;
    }

    public static ThreadEnum getThreadNameByKey(int index)
    {
        ThreadEnum[] myArray = ThreadEnum.values();
        for(ThreadEnum element : myArray) {
            if(index == element.getRetCode())
            {
                return element;
            }
        }
        return null;
    }
}