让线程同时进行,闭锁
一个或多个线程,等待其他线程执行完之后再执行
比如启动web框架,主线程会等待所有初始化线程执行完之后再继续执行
注意:1,计数器和线程数并不是一对一的关系。计数器可以远大于线程数
2,当工作线程减完(做完countDown任务)之后,可以继续运行做其他的任务,不一定会关闭或者退出
应用场景
1,时间上的并行性,让指定的线程可以同时开放
2,操作excel,多个子线程同时处理不同的表单,等处理完,主线程汇总
3,启动应用程序,进行初始化工作,其他的初始化任务全做完了再让主线程进行下一步操作
........
实例代码
/**
*类说明:演示CountDownLatch用法,
* 共5个初始化子线程,6个闭锁扣除点,扣除完毕后,主线程和业务线程才能继续执行
*/
public class UseCountDownLatch {
static CountDownLatch latch = new CountDownLatch(6);
/*初始化线程*/
private static class InitThread implements Runnable{
public void run() {
System.out.println("Thread_"+Thread.currentThread().getId()
+" ready init work......");
latch.countDown();
for(int i =0;i<2;i++) {
System.out.println("Thread_"+Thread.currentThread().getId()
+" ........continue do its work");
}
}
}
/*业务线程等待latch的计数器为0完成*/
private static class BusiThread implements Runnable{
public void run() {
try {
latch.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
for(int i =0;i<3;i++) {
System.out.println("BusiThread_"+Thread.currentThread().getId()
+" do business-----");
}
}
}
public static void main(String[] args) throws InterruptedException {
new Thread(new Runnable() {
public void run() {
try {
Thread.sleep(1);
}catch (Exception e){}
System.out.println("Thread_"+Thread.currentThread().getId()
+" ready init work step 1st......");
latch.countDown();
System.out.println("begin step 2nd.......");
try {
Thread.sleep(1);
}catch (Exception e){}
System.out.println("Thread_"+Thread.currentThread().getId()
+" ready init work step 2nd......");
latch.countDown();
}
}).start();
new Thread(new BusiThread()).start();
for(int i=0;i<=3;i++){
Thread thread = new Thread(new InitThread());
thread.start();
}
latch.await();
System.out.println("Main do ites work........");
}
}
最后修改于 2019-08-29 21:58:47
如果觉得我的文章对你有用,请随意赞赏
扫一扫支付

