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,线程不安全,可能会出现以下问题