public class StartVsRun {
    public static void main(String[] args) throws InterruptedException {
        // Slot untuk merekam nama thread yang menjalankan body tugas.
        String[] pelaksana = new String[1];

        Thread t = new Thread(() -> {
            // Thread.currentThread() mengembalikan thread yang sedang menjalankan
            // baris ini, bisa thread main ataupun thread baru, tergantung siapa
            // pemanggil run().
            pelaksana[0] = Thread.currentThread().getName();
        });
        t.setName("pekerja");

        // Eksperimen 1: memanggil run() secara langsung.
        // Tidak ada thread baru; body dieksekusi sinkron oleh thread main.
        t.run();
        System.out.println("run()   dieksekusi oleh : " + pelaksana[0]);

        // Eksperimen 2: memanggil start().
        // JVM membuat thread baru bernama "pekerja" dan menjalankan run() di sana.
        t.start();
        t.join();
        System.out.println("start() dieksekusi oleh : " + pelaksana[0]);
    }
}
