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 SepuluhRibuTugas {
    public static void main(String[] args) throws Exception {
        final int JUMLAH_TUGAS = 10_000;
        long total = 0;
        int selesai = 0;

        // Satu virtual thread per task: 10.000 penunggu berjalan bersamaan.
        try (ExecutorService eksekutor = Executors.newVirtualThreadPerTaskExecutor()) {
            List<Future<Integer>> futures = new ArrayList<>(JUMLAH_TUGAS);
            for (int i = 1; i <= JUMLAH_TUGAS; i++) {
                int nomor = i;
                // Setiap task meniru panggilan layanan luar: menunggu 1 ms.
                futures.add(eksekutor.submit(() -> {
                    Thread.sleep(1); // penungguan I/O tiruan
                    return nomor;
                }));
            }
            for (Future<Integer> f : futures) {
                total += f.get();
                selesai++;
            }
        } // close(): seluruh task ditunggu sampai tuntas

        System.out.println("task selesai : " + selesai);
        System.out.println("jumlah hasil : " + total);
    }
}
