在一次基于多線程的編碼測試中,發現繼承Runnable接口的線程實現類在運行時并未按預計啟動多線程,經分析和比較后,找出問題所現,現將其記錄下來,以供分享。
Java中,多線程編程中的線程編寫,有兩種方式,即擴展Thread基類或繼承Runnable接口;例如:
public class T extends Thread {
public void run() {
……
}
}
public class R implements Runnable {
public void run() {
……
}
}
對于擴展Thread的實現類T,可以使用T.start()來啟動此線程;如
public static void main(String[] args) {
Thread t = new T();
t.start();
}
但對于繼承Runnable接口的實現類R,因接口中并沒有提供直接啟動線程的start()方法,只有一個線程主邏輯運行的run()方法。此時,如執行run(),會因為R.run()只是作為此線程實現類的一個方法,并未在主線程之外,啟動另一個線程,從而導致R.run()阻斷主線程繼續向下執行;并未達到多線程運行的目的。
錯誤啟動代碼如下:
public static void main(String[] args) {
R r = new R();
r.run();
}
那么,如何使用另外線程來啟動繼承Runnable接口的實現類呢?以下就是它的正確的使用方式:
public static void main(String[] args) {
R r = new R();
Thread t = new Thread(r);
t.start();
}
此時,需注意,在主線程執行時,需等待子線程執行,否則,當主線程結束后,子線程也將結束。