import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit;

public class FutureBlocking {
    public static void main(String[] args) throws Exception {
        ExecutorService eksekutor = Executors.newFixedThreadPool(2);
        try {
            // Task cepat: get() memblokir pemanggil sampai hasil tersedia.
            Future<Integer> penjumlahan = eksekutor.submit(() -> {
                int total = 0;
                for (int i = 1; i <= 100; i++) {
                    total += i;
                }
                return total;
            });
            System.out.println("hasil penjumlahan  : " + penjumlahan.get());

            // Task 200 ms: get dengan tenggat 1 detik -- cukup longgar.
            Future<String> pembayaran = eksekutor.submit(() -> {
                Thread.sleep(200);
                return "pembayaran terkonfirmasi";
            });
            System.out.println("status pembayaran  : "
                    + pembayaran.get(1, TimeUnit.SECONDS));

            // Task 5 detik: dibatalkan lebih awal lewat interrupt.
            Future<String> sinkronisasi = eksekutor.submit(() -> {
                Thread.sleep(5_000);
                return "sinkronisasi selesai";
            });
            Thread.sleep(50); // pastikan task sudah mulai berjalan
            boolean dibatalkan = sinkronisasi.cancel(true);
            System.out.println("sinkronisasi dibatalkan: " + dibatalkan);
            System.out.println("status future: dibatalkan=" + sinkronisasi.isCancelled()
                    + ", selesai=" + sinkronisasi.isDone());
        } finally {
            eksekutor.shutdownNow(); // tidak ada task lagi yang perlu ditunggu
        }
    }
}
