CompletableFuture

CompletableFuture ialah class yang disediakan untuk menulis code concurrency menggunakan cara penulisan yang sama dengan syntax Java 8. Cara ini sama seperti future dan promise yang digunakan dalam JavaScript.

Untuk membuat CompletableFuture, kita boleh menggunakan method supplyAsync(), seperti berikut,

CompletableFuture<Integer> numberFuture = CompletableFuture.supplyAsync(() -> 100);

Untuk lebih ringkas, kita boleh menggunakan import static,

import static java.util.concurrent.CompletableFuture.supplyAsync;

Kemudian tukar ke,

CompletableFuture<Integer> numberFuture = supplyAsync(() -> 100);

Code di dalam lambda tersebut akan proses dalam thread yang tersendiri, sama seperti menggunakan class Thread.

Jika anda masih ingat, apabila kita menggunakan syntax Java 8, kita tidak perlu menukar mana-mana variable. Kita hanya perlu mengambil tahu output yang return daripada sesebuah code. Code di atas akan return nombor 100. Untuk menggunakan nombor tersebut, kita boleh menggunakan salah satu daripada method then dalam CompletableFuture. Contoh jika kita mahu print nombor tersebut, kita boleh menggunakan method thenAcceptAsync, seperti berikut,

numberFuture
        .thenAcceptAsync(x -> System.out.println("Log nombor: " + x));

Kita juga boleh menggunakan beberapa method then untuk future yang sama. Contohnya,

CompletableFuture<Integer> numberFuture = supplyAsync(() -> 100);

numberFuture
        .thenAcceptAsync(x -> System.out.println("Log nombor: " + x));

numberFuture
        .thenAcceptAsync(x -> System.out.println("Nombor dari database: " + x));

Apa yang berlaku ialah program akan menjalankan kedua-dua code tersebut secara serentak selepas mendapat output daripada future berkenaan. Jika kita run program ini berulang kali, kita boleh lihat ada masa program akan print tidak mengikut urutan.

Jika anda run code tersebut, kadang-kadang program tidak akan mengeluarkan output kerana program kita sudah berakhir semasa code-code tersebut sedang berjalan di thread yang lain. Kita boleh membuatkan code menunggu dengan menambah code berikut di penghujung,

try {
    Thread.sleep(300);
} catch (InterruptedException e) {
    e.printStackTrace();
}

Website ini menggunakan cookie yang dikendalikan oleh pihak ketiga. Anda boleh membaca dengan lebih lanjut di sini. Dengan menggunakan website ini, anda bersetuju dengan penggunaan cookie tersebut.

Setuju