import java.util.concurrent.Callable;
import java.util.concurrent.FutureTask;

public class RunnableVsCallable {
    public static void main(String[] args) throws Exception {
        // ---- Runnable: run() tidak mengembalikan nilai ----
        long[] hasilRunnable = new long[1];
        Runnable tugasRunnable = () -> {
            long total = 0;
            for (int i = 1; i <= 100; i++) {
                total += i;
            }
            hasilRunnable[0] = total; // hasil diselundupkan lewat array bersama
        };
        Thread t1 = new Thread(tugasRunnable, "runnable");
        t1.start();
        t1.join();

        // ---- Callable: call() mengembalikan nilai ----
        Callable<Long> tugasCallable = () -> {
            long hasil = 1;
            for (int i = 1; i <= 10; i++) {
                hasil *= i;
            }
            return hasil; // nilai dikembalikan langsung ke pemanggil
        };
        FutureTask<Long> tugas = new FutureTask<>(tugasCallable);
        Thread t2 = new Thread(tugas, "callable");
        t2.start();
        t2.join();

        Long hasilCallable = tugas.get(); // mengambil hasil setelah tugas selesai
        System.out.println("Runnable menjumlahkan 1..100 : " + hasilRunnable[0]);
        System.out.println("Callable menghitung 10!       : " + hasilCallable);
    }
}
