Java Thread

當本文使用 Thread 時,指的是 Thread 這個類別,而非執行緒。

執行緒是 Java 中重要的一環,可以讓我們的程式分成不同部分(看起來)同時運行。建立執行緒有兩種方式,第一種是直接繼承 Thread ,而另一種則是實作 Runnable 。

繼承 Thread

繼承 Thread 的話只要覆寫 run() 方法就可以了,可以在 run() 中放入任何想要做的事。 例如我想要印出一些數字,並在之間 sleep() 一秒鐘:

public class MyThread extends Thread { 
    @Override  
    public void run() {  
        for (int i = 0; i < 5; i++) {  
            System.out.println(i);
  
            try {  
                sleep(1000);  
            } catch (InterruptedException e) {  
                throw new RuntimeException(e);  
            }  
        }  
    }  
}

要讓這個執行緒開始跑,並不是呼叫 run() ,而是呼叫 start() ,因為呼叫 run() 並不會建立一個新的執行緒。

public class Main {  
    public static void main(String[] args) { 
		MyThread thread = new MyThread();
		thread.start();
    }  
}

實作 Runnable

Runnable 介面只有一個方法 run() ,因此實作時和繼承 Thread 時一樣:

public class MyRunnable implements Runnable { 
    @Override  
    public void run() {  
        for (int i = 0; i < 5; i++) {  
            System.out.println(i);
        }  
    }  
}

現在它還不是一個可以跑的執行緒,要先呼叫 Thread 的建構子,並把 MyRunnable 當作參數建立一個 Thread 。

public class Main {  
    public static void main(String[] args) { 
		MyRunnable runnable = new MyRunnable();
		Thread thread = new Thread(runnable);
		thread.start();
    }  
}

Runnable 與 Thread

那麼到底該實作 Runnable 還是繼承 Thread 呢? Thread 實作了 Runnable ,並新增了許多方法如 wait(), sleep() 等,但是使用實作 Runnable 的方法最終還是會建立一個 Thread ,所以一樣可以用到 Thread 的方法。此外,由於 Java 不允許多重繼承,因此實作 Runnable 的好處是不會佔用繼承的位置。 總而言之,能用 Runnable 就盡量用吧!