简单介绍下使用CountDownLatch 的使用方法
CountDownLatch 是在开始指定线程数,然后通过 latch.countDown();终止一次线程数-1,最后执行完成通过
调用 latch.await(); 在这个方法之后,所有的线程都执行完毕。
我的使用场景是异步的数据组装。
下面贴出一些简单的实例代码,基于此代码可以参考 CountDownLatch 的使用
package com.example.thread;
import java.util.List;
import java.util.concurrent.CountDownLatch;
/**
* 类BuildBaseInfoThread.java的实现描述:TODO 类实现描述
*
* @author xupeng 2017年5月15日 下午6:58:01
*/
public class BuildBaseInfoThread extends Thread {
private CountDownLatch latch;
private List<String> result;
@Override
public void run() {
try {
Thread.sleep(1000);
result.add("baseInfo");
} catch (Exception e) {
e.printStackTrace();
} finally {
latch.countDown();
System.out.println(latch.getCount());
}
}
public BuildBaseInfoThread(CountDownLatch latch, List<String> result) {
super();
this.latch = latch;
this.result = result;
}
}
package com.example.thread;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.CountDownLatch;
/**
* 类BuildBaseInfoThread.java的实现描述:TODO 类实现描述
*
* @author xupeng 2017年5月15日 下午6:58:01
*/
public class BuildExtendInfoThread extends Thread {
private CountDownLatch latch;
private List<String> result;
@Override
public void run() {
try {
Thread.sleep(2000);
List<String> list = new ArrayList<String>();
// synchronized (result) {同步汇总
// result.addAll(list);
// }
result.add("extend");
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
}
latch.countDown();
System.out.println(latch.getCount());
}
}
public BuildExtendInfoThread(CountDownLatch latch, List<String> result) {
super();
this.latch = latch;
this.result = result;
}
}
package com.example.thread;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.CountDownLatch;
public class CountDownLatchTest {
public static void main(String[] args) {
CountDownLatch latch = new CountDownLatch(2);
List<String> result = new ArrayList<String>();
new BuildBaseInfoThread(latch, result).start();
new BuildExtendInfoThread(latch, result).start();
System.out.println(result);
try {
latch.await();
System.out.println(result);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}