Pada artikel ini, saya akan berbicara tentang bagaimana kita dapat mengurutkan thread yang berbeda sehingga berjalan sesuai urutan yang kita inginkan. Tentu saja, ada cara tradisional untuk memastikan ketertiban tetapi saya ingin menunjukkan kepada Anda cara elegan yang disebut CompletableFuture yang diperkenalkan di Java 8.

1- Apa itu CompletableFuture?

CompletableFuture adalah cara baru mengeksekusi thread yang sangat mudah digunakan seperti yang akan Anda lihat sekarang. Mari kita lihat bagaimana kita dapat mengeksekusi thread dengan ini. Pertama, kita membuat kelas Runnable.

public class TextDownloader implements Runnable {

    @Override
    public void run() {
        // Download text from server
        System.out.println("I am downloading the file containing text to a directory");
        try {
            Thread.sleep(2000); // for simulating download wait time
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

Di TextDownloader class, saya menyimulasikan operasi pengunduhan yang membutuhkan waktu untuk diselesaikan. Tentu saja, kami ingin menjalankan operasi pengunduhan di thread terpisah sebagai berikut.

CompletableFuture
        .runAsync(new TextDownloader());

Lihat betapa mudah dan bagusnya itu! Sekarang mari tambahkan bagian lain ke dalamnya dan proses teks yang diunduh. Ketika kami selesai mengunduh teks (sebagai file), kami menyimpannya ke beberapa lokasi di sistem file kami untuk diproses nanti. Inilah bagian kuncinya, kita perlu memastikan bahwa tahap pengunduhan telah selesai sehingga kita dapat mengaksesnya nanti untuk diproses. Berikut kelas prosesornya

public class TextProcessor implements Runnable {

    @Override
    public void run() {
        // Process downloaded text
        System.out.println("I am taking the text from the location and processing the text");
    }
}

Dan kami menjalankannya sebagai berikut untuk memastikan pemesanan

CompletableFuture
        .runAsync(new TextDownloader())
        .thenRunAsync(new TextProcessor());

Metode thenRunAsync memastikan bahwa thread yang dieksekusi melalui runAsyncselesai dan kemudian menjalankan apa yang diberikan padanya. Dalam contoh di atas, kami berasumsi bahwa thread kedua sudah mengetahui di mana "thread" pertama meletakkan file yang diunduh ke dalam sistem file. Namun bagaimana jika tidak? Mari kita cari tahu bagaimana kita bisa menanganinya dengan Pemasok.

public class TextDownloader2 implements Supplier<String> {

    @Override
    public String get() {
        System.out.println("I am downloading the file containing text to a directory");
        try {
            Thread.sleep(2000); // for simulating download wait time
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return "pathToDownloadedFile";
    }
}

Di atas, Anda dapat melihat versi pengunduh teks yang diperbarui. Perbedaannya adalah sekarang ia mengimplementasikan antarmuka pemasok yang metode getnya mengembalikan nilai. Kita dapat meneruskan nilai yang dikembalikan ke kelas prosesor sehingga kelas tersebut mengetahui di mana menemukan file yang diunduh. Kelas pengolah teks yang diperbarui kini mengimplementasikan antarmuka Konsumen untuk menggunakan output yang disediakan oleh Pemasok.

public class TextProcessor2 implements Consumer<String> {

    @Override
    public void accept(String s) {
        // Process downloaded text
        System.out.println("I am taking the text from the location and processing the text");
        System.out.println("Path: " + s);
    }
}

Dan bagaimana kita dapat memanfaatkannya bersama-sama

CompletableFuture
        .supplyAsync(new TextDownloader2())
        .thenAccept(new TextProcessor2());

Anda juga dapat memberikan logika Anda langsung di dalam thenAcceptsebagai berikut

CompletableFuture
        .supplyAsync(new TextDownloader2())
        .thenAccept(path -> {
            // some logic
        });

Ada beberapa metode berbeda di kelas CompletableFuture yang dapat Anda manfaatkan seperti thenAcceptAsync atau thenApplytetapi saya tidak ingin membuat artikel ini lebih panjang untuk saat ini.

Dalam tutorial ini, saya berbicara tentang memesan eksekusi thread. Kuharap kamu menikmatinya.