java基礎----CountDownLatch、Enum
阿新 • • 發佈:2020-09-11
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; } }