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 JenisPool {
    // Jalankan 6 task yang sama pada satu eksekutor, kumpulkan hasilnya
    // lewat Future.get() berurutan -- hasil selalu terurut sesuai pengiriman.
    private static List<Integer> jalankan(ExecutorService eksekutor) throws Exception {
        List<Future<Integer>> futures = new ArrayList<>();
        for (int i = 1; i <= 6; i++) {
            int nomor = i;
            futures.add(eksekutor.submit(() -> {
                Thread.sleep(20); // meniru pekerjaan singkat
                return nomor * nomor; // kuadrat nomor task
            }));
        }
        List<Integer> hasil = new ArrayList<>();
        for (Future<Integer> f : futures) {
            hasil.add(f.get());
        }
        eksekutor.shutdown();
        return hasil;
    }

    public static void main(String[] args) throws Exception {
        // Empat jenis eksekutor, satu pekerjaan yang sama.
        System.out.println("fixed 2 thread        : "
                + jalankan(Executors.newFixedThreadPool(2)));
        System.out.println("cached                : "
                + jalankan(Executors.newCachedThreadPool()));
        System.out.println("work-stealing 2 pekerja: "
                + jalankan(Executors.newWorkStealingPool(2)));
        System.out.println("virtual per task      : "
                + jalankan(Executors.newVirtualThreadPerTaskExecutor()));
    }
}
