CountDownLatch 是一个同步工具类,用来协调多个线程之间的同步,它能够使一个线程在等待另外一些线程完成各自工作之后,再继续执行。
这里是使用CountDownLatch和多线程完成商品信息异步组装:
import java.time.LocalDateTime;
import java.util.StringJoiner;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
/**
* @author 向振华
* @date 2023/01/04 14:01
*/
public class Test {
public static void main(String[] args) {
// 创建线程池
ExecutorService executorService = Executors.newFixedThreadPool(10);
CountDownLatch countDownLatch = new CountDownLatch(3);
System.out.println("开始 " + LocalDateTime.now());
StringJoiner sj = new StringJoiner("、");
// 线程1
executorService.execute(() -> {
try {
String do1 = do1();
sj.add(do1);
} catch (Exception e) {
e.printStackTrace();
} finally {
countDownLatch.countDown();
}
});
// 线程2
executorService.execute(() -> {
try {
String do2 = do2();
sj.add(do2);
} catch (Exception e) {
e.printStackTrace();
} finally {
countDownLatch.countDown();
}
});
// 线程3
executorService.execute(() -> {
try {
String do3 = do3();
sj.add(do3);
} catch (Exception e) {
e.printStackTrace();
} finally {
countDownLatch.countDown();
}
});
try {
countDownLatch.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(sj.toString());
System.out.println("完成 " + LocalDateTime.now());
}
private static String do1() {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("1查询商品规格信息");
return "商品规格";
}
private static String do2() {
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("2查询商品价格信息");
return "商品价格";
}
private static String do3() {
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("3查询商品图片信息");
return "商品图片";
}
}
输出结果:
开始 2023-01-04T14:16:40.441
1查询商品规格信息
3查询商品图片信息
2查询商品价格信息
商品规格、商品图片、商品价格
完成 2023-01-04T14:16:45.468