CompletableFuture sebagai Asynchronous Pemograman Java

Omjebs > Tech > CompletableFuture sebagai Asynchronous Pemograman Java
display coding programming development

CompletableFuture sebagai Asynchronous Pemograman Java

Synchronous vs Asynchronous

Sebelum bahas apa itu Completable Future, ada baiknya kita mengetahui sedikit tentang Synchronous dan Asynchronous.

Synchronous merupakan sebuah model Thread yang ditugaskan untuk mengerjakan sebuah task sampai selesai, lalu dapat melanjutkan ke task yang lain. Sedangkan Asynchronous merupakan sebuah Thread yang ditugaskan untuk mengerjakan banyak task dalam waktu yang bersamaan tanpa perlu menunggu task yang sebelumnya selesai. Salah satu fitur pada Java untuk mengimplementasikan Asynchronous itu sendiri yaitu Completable Future.

Completable Future

2 Fitur utama pada Completable future yaitu runAsync() dan supplyAsync()

  • CompletableFuture.runAsync(): untuk menjalankan asynchronous tasks tanpa mengembalikan return result apapun pada suatu function <Void>.
private static void completableFutureVoidLambda() throws ExecutionException, InterruptedException {
    
    //define
    CompletableFuture<Void> cf = CompletableFuture.runAsync(() -> {
        System.out.println("Run Void Function");
    });

    // to get the result of Completable Future
    cf.get();
    
}

CompletableFuture.supplyAsync(): untuk menjalankan asynchronous tasks dengan mengembalikan return result pada suatu function sesuai tipe data yang kita inginkan.

private static void completableFutureStringLambda() throws ExecutionException, InterruptedException {

    //define
    CompletableFuture<String> cf = CompletableFuture.supplyAsync(() -> {
        return "Hello World!";
    });

    // get return as String
    System.out.println(cf.get());
    
}

Callbacks of Completable Future

Ada beberapa callback dari Completable future itu sendiri yaitu thenApply() , thenAccept , thenRun()

ThenApply() berjalan pada thread yang sama untuk memproses dan mengubah suatu value dari Completable Future dengan return sesuai tipe data contoh di bawah ini mengembalikan result String.

private static void completableFutureThenApply() throws ExecutionException, InterruptedException {
    CompletableFuture<String> cf = CompletableFuture.supplyAsync(() -> {
        return "Es Pisang Ijo";
    }).thenApply(it -> {
        return it + " rasanya manis ";
    }).thenApply(it -> {
        return it + "dengan harga murah.";
    });

    // get result as String
    System.out.println(cf.get());
}
Es Pisang Ijo rasanya manis dengan harga murah.
  • thenAccept()
READ  Pertanyaan Interview Sat Melamar Menjadi Programmer

ThenAccept() sama seperti ThenApply() hanya saja result yang dikembalikan bertipe <void>

private static void completableFutureThenAccept() {
    CompletableFuture.supplyAsync(() -> {
        return "Red";
    }).thenAccept(it -> {
        System.out.println("Watermelon is " + it );
    });
}
Watermelon is Red

thenRun() digunakan untuk tidak mengembalikan hasil apapun namun tetap dapat menjalankan program didalamnya.

private static void completableFutureThenRun(String locations) throws ExecutionException, InterruptedException {
    
    CompletableFuture<String> cfString = CompletableFuture.supplyAsync(() -> "DKI Jakarta");
    
    CompletableFuture<Void> cfVoid = cfString.thenRun(() ->
        System.out.println("Done")
    );
    
    //get result
    cfVoid.get();
}

thenApplyAsync() tidak jauh berbeda dengan thenApply(), hanya saja thenApply() dijalankan di thread yang sama, sedangkan thenApplyAsync() akan menjalankan dengan thread yang berbeda di dalam SupplyAsync() yang sama.

private static void completableFutureThenApplyAsync() throws ExecutionException, InterruptedException {
 
    CompletableFuture<String> cf = CompletableFuture.supplyAsync(() -> {
        return "Es Pisang Ijo";
    }).thenApplyAsync(it -> {
        return it + " rasanya manis ";
    }).thenApplyAsync(it -> {
        return it + "dengan harga murah.";
    });

    // get result as String
    System.out.println(cf.get());
    
}

Completable Future as a Return

Cara untuk menggabungkan dua atau lebih Completable Future, diantaranya menggunakan thenCompose() dan thenCombine(). Singkatnya jika thenApply() mengembalikan sebuah value yang spesifik, maka thenCompose() dan thenCombine() akan mengembalikan CompletableFuture lainnya.

perbedaanya jika ThenCompose() mengembalikan CompletableFuture yang dengan ketergantungan pada CompletableFuture lainnya, maka ThenCombine() tidak memiliki ketergantungan dengan CompletableFuture lainnya atau berjalan secaran independen.

CompletableFuture<String> cfCompose
        = CompletableFuture.supplyAsync(() -> "Hello")
        .thenCompose(it -> CompletableFuture.supplyAsync(() -> it + " World"));

CompletableFuture<String> cfCombine = CompletableFuture.supplyAsync(() -> "Hello")
        .thenCombine(CompletableFuture.supplyAsync(() -> " World"), (x, z) -> x + z);

0 0 votes
Article Rating
Subscribe
Notify of
0 Comments
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x
()
x