JUC:05.CountDownLatch
一、概述
CountDownLatch可以使得當前執行緒阻塞,直到當CountDownLatch中的計數器減少至0,當前執行緒才能繼續往下執行.與Thread中的join()方法類似。
二、常用方法
- CountDownLatch(int count):指定計數器的值
- public void await() throws InterruptedException:呼叫後當前執行緒阻塞,直到當計數器的值為0,方法返回,該方法可以響應中斷
- public boolean await(long timeout, TimeUnit unit) throws InterruptedException:可以超時時間等待,如果在規定的時間內返回,就返回ture。否則返回false
- public void countDown():讓計數器減1
三、案例
簡單使用
public class Demo1 {
public static void main(String[] args) throws InterruptedException {
int count = 5;
CountDownLatch countDownLatch = new CountDownLatch(count);
for (int i=1;i<=count;i++){
Thread thread = new Thread(()->{
try {
TimeUnit.SECONDS.sleep(5);
} catch (InterruptedException e) {
e.printStackTrace();
}finally {
System.out.println(Thread.currentThread().getName()+"到達終點");
countDownLatch.countDown();
}
});
thread.setName("執行緒"+i);
thread.start();
}
System.out.println("main執行緒被阻塞,需要等待其他所有執行緒到達終點,才能繼續往下執行");
countDownLatch.await();
System.out.println("main執行緒繼續執行,執行結束");
}
}
執行效果:
main執行緒被阻塞,需要等待其他所有執行緒到達終點,才能繼續往下執行
執行緒1到達終點
執行緒2到達終點
執行緒3到達終點
執行緒4到達終點
執行緒5到達終點
main執行緒繼續執行,執行結束
超時時間等待
public class Demo2 {
public static void main(String[] args) throws InterruptedException {
int count = 5;
CountDownLatch countDownLatch = new CountDownLatch(count);
for (int i=1;i<=count;i++){
Thread thread = new Thread(()->{
try {
int time = (int)(Math.random()*10+1);
TimeUnit.SECONDS.sleep(time);
} catch (InterruptedException e) {
e.printStackTrace();
}finally {
System.out.println(Thread.currentThread().getName()+"到達終點");
countDownLatch.countDown();
}
});
thread.setName("執行緒"+i);
thread.start();
}
System.out.println("main執行緒被阻塞,等待5秒其他執行緒到達終點");
boolean flag = countDownLatch.await(6,TimeUnit.SECONDS);
if (flag){
System.out.println("main執行緒等待其他執行緒到達才結束");
}else {
System.out.println("mian執行緒等不及了,自己往下執行結束");
}
}
}
執行結果:
main執行緒被阻塞,等待5秒其他執行緒到達終點
執行緒5到達終點
執行緒4到達終點
mian執行緒等不及了,自己往下執行結束
相關文章
- JUC
- JUC簡介
- JUC工具(LockSupport)
- JUC的概述
- JUC之Volatile
- JUC之Callable介面回顧和JUC輔助類
- JUC 程式設計程式設計
- JUC集合安全-Map
- JUC前置知識
- Java JUC PriorityBlockingQueue解析JavaBloC
- Java JUC CopyOnWriteArrayList 解析Java
- Java JUC ThreadPoolExecutor解析Javathread
- Java JUC ReentrantLock解析JavaReentrantLock
- Java JUC LockSupport概述Java
- Java JUC LinkedBlockingQueue解析JavaBloC
- Java JUC ReentrantReadWriteLock解析Java
- Java JUC ConcurrentLinkedQueue解析Java
- JUC筆記(4)筆記
- 【JDK1.8】JUC——AbstractQueuedSynchronizerJDK
- 合集 - JUC基礎(13)
- Java JUC ThreadLocalRandom類解析Javathreadrandom
- JUC之Fork/Join框架框架
- 走進JUC的世界
- 1. JUC簡介
- JUC 原始碼講解:sleep()原始碼
- JUC鎖種類總結
- JUC(3)---CountDownLatch、CyclicBarrier和AQSCountDownLatchAQS
- JUC之ReentrantLock原始碼分析ReentrantLock原始碼
- JUC之CountDownLatch原始碼分析CountDownLatch原始碼
- JUC---ThreadLocal原理詳解thread
- 聊聊併發(一)——初始JUC
- JUC面試點彙總面試
- juc包:使用 juc 包下的顯式 Lock 實現執行緒間通訊執行緒
- JUC執行緒筆記(一)執行緒筆記
- 解讀 JUC —— AQS 獨佔模式AQS模式
- 【JUC】8-CompletableFutrue的常用方法
- JUC之讀寫鎖問題
- Ty-JUC基礎筆記筆記