CompletableFuture的使用

代码

public static void main(String[] args) {
    long begin = System.currentTimeMillis();
    // 这里涉及到并发修改,不要使用ArrayList
    List<Double> list = new CopyOnWriteArrayList<>();
    CompletableFuture<Void> f1 = CompletableFuture.supplyAsync(TestMain::getPrice).thenAccept(result -> {
        list.add(result);
        System.out.println("f1 -> " + result);
    }).exceptionally(e -> {
        e.printStackTrace();
        return null;
    });
    CompletableFuture<Void> f2 = CompletableFuture.supplyAsync(TestMain::getPrice).thenAccept(result -> {
        list.add(result);
        System.out.println("f2 -> " + result);
    }).exceptionally(e -> {
        e.printStackTrace();
        return null;
    });
    CompletableFuture.allOf(f1, f2).join();
    System.out.println(list);
    System.out.println("耗时:" + (System.currentTimeMillis() - begin));
}
static Double getPrice() {
    try {
        Thread.sleep(2000);
    } catch (Exception e) {
        throw new RuntimeException(e);
    }
    if (Math.random() < 0.1) {
        throw new RuntimeException("error get price");
    }
    return Math.ceil(Math.random() * 20);
}

线程安全问题

使用ArrayList,线程不安全,可能会出现以下问题

posted @ 2021-08-19 07:42  我自逍遥  阅读(27)  评论(0编辑  收藏  举报