import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;

public class KipasLayanan {

    // Meniru panggilan layanan luar: hampir seluruh waktunya hanya menunggu.
    static String muat(String layanan, int milidetik) throws InterruptedException {
        Thread.sleep(milidetik);
        return layanan + " selesai (" + milidetik + " ms)";
    }

    public static void main(String[] args) throws Exception {
        // 1) Bentuk langsung: virtual thread bernama lewat builder.
        String[] nama = {"katalog", "persediaan", "ulasan"};
        Thread[] pekerja = new Thread[3];
        String[] hasilLangsung = new String[3];
        for (int i = 0; i < 3; i++) {
            int idx = i;
            pekerja[i] = Thread.ofVirtual().name("kurator-" + nama[i]).start(() ->
                    hasilLangsung[idx] = nama[idx] + ": data termuat");
        }
        for (Thread t : pekerja) {
            t.join();
        }
        for (int i = 0; i < 3; i++) {
            System.out.println(pekerja[i].getName() + " | virtual: "
                    + pekerja[i].isVirtual() + " | " + hasilLangsung[i]);
        }

        // 2) Bentuk executor: satu virtual thread per task.
        try (ExecutorService eksekutor = Executors.newVirtualThreadPerTaskExecutor()) {
            List<Future<String>> futures = new ArrayList<>();
            futures.add(eksekutor.submit(() -> muat("katalog", 40)));
            futures.add(eksekutor.submit(() -> muat("persediaan", 20)));
            futures.add(eksekutor.submit(() -> muat("ulasan", 60)));

            List<String> hasil = new ArrayList<>();
            for (Future<String> f : futures) {
                hasil.add(f.get());
            }
            hasil.sort(null); // urutan cetak tetap deterministik
            hasil.forEach(System.out::println);
        } // close(): menunggu seluruh task tuntas
    }
}
