public class CaraMembuatThread {
    public static void main(String[] args) throws InterruptedException {
        int[] hasil = new int[2];

        // Jalur 1: membuat subclass dari Thread.
        Thread t1 = new PenghitungKuadrat(hasil, 0, 12);
        t1.setName("kuadrat");

        // Jalur 2: membuat class yang mengimplementasikan Runnable,
        // lalu membungkusnya dengan objek Thread.
        Thread t2 = new Thread(new PenghitungPangkatTiga(hasil, 1, 9));
        t2.setName("pangkat-tiga");

        t1.start();
        t2.start();
        t1.join();
        t2.join();

        System.out.println("kuadrat dari 12      : " + hasil[0]);
        System.out.println("pangkat tiga dari 9  : " + hasil[1]);
    }
}

class PenghitungKuadrat extends Thread {
    private final int[] hasil;
    private final int indeks;
    private final int nilai;

    PenghitungKuadrat(int[] hasil, int indeks, int nilai) {
        this.hasil = hasil;
        this.indeks = indeks;
        this.nilai = nilai;
    }

    @Override
    public void run() {
        hasil[indeks] = nilai * nilai;
    }
}

class PenghitungPangkatTiga implements Runnable {
    private final int[] hasil;
    private final int indeks;
    private final int nilai;

    PenghitungPangkatTiga(int[] hasil, int indeks, int nilai) {
        this.hasil = hasil;
        this.indeks = indeks;
        this.nilai = nilai;
    }

    @Override
    public void run() {
        hasil[indeks] = nilai * nilai * nilai;
    }
}
