CompletableFuture Demo
題目:有一個資料庫client,從資料庫中取資料A和資料B,然後求和。請使用併發的知識,儘快的完成操作。
/**
* {@code @author:} keboom
* {@code @date:} 2024/3/8
* {@code @description:}
*/
public class DataBaseClient {
@SneakyThrows
public int getAge() {
Thread.sleep(randomSpeed());
return 18;
}
@SneakyThrows
public int getOtherAge() {
Thread.sleep(randomSpeed());
return 20;
}
private int randomSpeed() {
return (int) (Math.random() * 1000);
}
@SneakyThrows
public static void main(String[] args) {
long start = System.currentTimeMillis();
DataBaseClient dataBaseClient = new DataBaseClient();
ArrayList<Integer> resultList = new ArrayList<>(10);
Semaphore semaphore = new Semaphore(0);
for (int i = 0; i < 10; i++) {
CompletableFuture<Integer> t1 = CompletableFuture.supplyAsync(dataBaseClient::getAge);
CompletableFuture<Integer> t2 = CompletableFuture.supplyAsync(dataBaseClient::getOtherAge);
CompletableFuture<Integer> result = t1.thenCombine(t2, (age1, age2) -> age1 + age2);
result.thenAccept((resultAge) -> {
resultList.add(resultAge);
semaphore.release();
});
// 這是序列的寫法
// int a2 = dataBaseClient.getOtherAge();
// int a1 = dataBaseClient.getAge();
// resultList.add(a1 + a2);
// 這是序列的寫法
}
semaphore.acquire(10);
long end = System.currentTimeMillis();
System.out.println(end - start);
}
}
main函式中是我們自己寫的程式碼,我們透過CompletableFuture非同步的從DataClient獲取資料,然後求和,放到resultList中。我這裡只模擬了10次。最終結果大概耗時 1.6s 左右。
如果是序列的話,是10s左右。
如果有更好的寫法,歡迎評論區分享。