#### CountDownLatch
CountDownLatch對象指定一個基數,每次執行countDown()方法,基數減一,直到這個基數為0時,執行await()方法后的代碼。一般await用于主方法中。
- 構造器方法
```
構造器:
CountDownLatch(int num); // 給定義的CountDownLatch指定一個數值
方法:
await(); // 等待直到傳入CountDownLatch對象中數值為0,再執行后面代碼。
await(long time, TimeUnit timeUnit); // 設置等待超時時間,如果再規定時間內CountDownLatch對象中數值沒有為0,則報錯,CountDownLatch失效。
countDown(); // 傳入CountDownLatch對象中數值減一
```
- 例子
```
public void CountDownLatchTest(){
int threadCount = 4;
CountDownLatch countDownLatch = new CountDownLatch(threadCount);
ExecutorService executorService = Executors.newSingleThreadExecutor();
for (int i = 0; i < threadCount; i++) {
executorService.execute(new Thread(new Runnable() {
@Override
public void run() {
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
countDownLatch.countDown();
System.out.println("當前線程"+Thread.currentThread().getName()+"執行完畢");
}
}));
}
executorService.shutdown();
System.out.println("等待線程執行完畢.....");
countDownLatch.await();
System.out.println("所有線程執行完");
}
```
#### CyclicBarrier
CyclicBarrier對象指定一個基數,每次執行await()方法時,基數減一,直到這個基數為0時,執行await()方法后的代碼。一般await用于線程方法中。
- 構造器方法
```
構造器:
CyclicBarrier(int num); // 給定義的CountDownLatch指定一個數值
CyclicBarrier(int num, Runnable r); // 給定義的CountDownLatch指定一個數值, 第二個參數指當基數為0時,創建一個線程參數為r的線程并執行,直到該線程執行結束后開始執行await方法后面的代碼
方法:
await(); // 每次執行await()方法時,傳入CyclicBarrier基數num減一,直到num為0,才執行await方法后續的代碼。
await(long time, TimeUnit timeUnit); // 同await方法,設定了等待的超時時間,如果超時,則會報超時錯誤,并且CyclicBarrier失效。
```
- 例子
```
public void CyclicBarrierTeset(){
for(int i = 0 ; i < 10 ; i++) {
Thread.sleep(1000);
new Thread(() ->{
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + "執行");
try {
cyclicBarrier.await();
} catch (BrokenBarrierException | InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("達到定義數目,wait方法后代碼執行");
}).start();
}
System.in.read();
}
```
- 2111總結
- 1.面向對象
- 1.0.1 super()與this()的區別
- 1.0.2 private、default、protected、public的訪問范圍
- 1.0.3 continue、break、return區別
- 1.0.4 重載和重寫的區別
- 1.0.5 final的特點
- 1.0.6 抽象類與接口的區別
- 1.0.7 java類型
- 1.0.8 什么是反射
- 1.0.9 類的加載機制
- 1.1.1 jvm內存結構
- 1.1.2 java垃圾回收機制
- 1.1.3 并發問題
- 1.1.3.1 線程的狀態與關系
- 1.1.3.2 并發的三大性質
- 1.1.3.3 線程的實現與使用
- 1.1.3.4 線程池相關
- 1.1.3.5 并發相關方法
- 1.1.3.6 線程相關工具
- 1.1.4 jdk8特性
- 1.1.4.1 lambad表達式的使用
- 1.1.4.2 stream API
- 1.1.4.3 Optional容器使用
- 1.1.4.4 LocalDateTime
- 1.15 io流
- 1.16 動態代理實現
- 2.JavaEE
- 2.0.1 JSP四大作用域九大內置對象
- 2.0.2 cookie與session的區別
- 4.數據庫相關
- 5.git版本管理
- 7.一些問題解決
- 7.1 分布式鎖如何實現