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