如题 (总结要点)
- CountDownLatch 倒计数门闩器,
- 让1-n-1个线程等待其他多线程完成工作。
- (Excel的多个Sheet的解析,最终等待解析完毕后;要实现主线程等待所有线程完成sheet解析操作,最简单的就是join )
- CountDownLatch latch = new CountDownLatch(2); // 使用倒计数门闩器 ,迫使主线程进入等待 ;设置N个结点 ,n个线程或者步骤
- latch.countDown();
- latch.await(1000, TimeUnit.MILLISECONDS); //阻塞当前线程,直到计数器变为0
- 原文链接 :
借鉴学习文章列表
- ALiBaBaJavaCodingGuideLines有话说 :
1.测试1 简单测试
public class Test03_countdownlatch {
public static void main(String[] args) {
Runnable runnable = new Runnable() {
@Override
public void run() {
System.out.println("hello ");
}
};
Thread thread1 = new Thread(runnable);
Thread thread2 = new Thread(runnable);
System.out.println("all thread finish");
}
}
2. 结果1 : 线程还没有来得及执行完毕,主线程就结束了,所以先打印的finish
all thread finish
hello
hello
3.测试2 迫使主线程通过子线程的join方法等待当前的子线程执行完毕
public static void main(String[] args) {
Runnable runnable = new Runnable() {
@Override
public void run() {
System.out.println("hello ");
}
};
Thread thread1 = new Thread(runnable);
Thread thread2 = new Thread(runnable);
thread1.start();
thread2.start();
try {
// 迫使主线程通过join方法等待当前的子线程执行完毕
thread1.join();
// 主线程第二次等待
thread2.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("all thread finish");
}
测试结果2
hello
hello
all thread finish
测试3 使用倒计数门闩器
public static void main(String[] args) {
Runnable runnable = () -> System.out.println("hello ");
Thread thread1 = new Thread(runnable);
Thread thread2 = new Thread(runnable);
// 使用倒计数门闩器 ,迫使主线程进入等待 ;设置N个结点 ,n个线程或者步骤都可以
CountDownLatch latch = new CountDownLatch(2);
thread1.start();
latch.countDown();
thread2.start();
latch.countDown();
try {
// 阻塞当前线程,直到计数器变为0; await(long time);也可以带时间!
latch.await(1000, TimeUnit.MILLISECONDS);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("all thread finish");
}
测试结果3
hello
hello
all thread finish