Java 使用CountDownLatch实现网络同步请求,异步同时获取商品信息组装

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

猜你喜欢

转载自blog.csdn.net/Anenan/article/details/128547521