CompletableFuture Demo

KeBoom發表於2024-03-08

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左右。

如果有更好的寫法,歡迎評論區分享。

相關文章