一辙培、認識Thread的 start() 和 run()
t.start()會導致run()方法被調(diào)用线定,run()方法中的內(nèi)容稱為線程體早芭,它就是這個線程需要執(zhí)行的工作罗岖。
用start()來啟動線程涧至,實現(xiàn)了真正意義上的啟動線程,此時會出現(xiàn)異步執(zhí)行的效果桑包,即在線程的創(chuàng)建和啟動中所述的隨機性南蓬。
而如果使用run()來啟動線程,就不是異步執(zhí)行了哑了,而是同步執(zhí)行赘方,不會達到使用線程的意義
1.start():
“start()方法會使得該線程開始執(zhí)行;java虛擬機會去調(diào)用該線程的run()方法弱左≌福”
使該線程開始執(zhí)行;Java 虛擬機調(diào)用該線程的run方法拆火。
結(jié)果是兩個線程并發(fā)地運行跳夭;當前線程(從調(diào)用返回給start方法)和另一個線程(執(zhí)行其run方法)。
???? 多次啟動一個線程是非法的们镜。特別是當線程已經(jīng)結(jié)束執(zhí)行后币叹,不能再重新啟動。
用start方法來啟動線程憎账,真正實現(xiàn)了多線程運行套硼,這時無需等待run方法體代碼執(zhí)行完畢而直接繼續(xù)執(zhí)行下面的代碼。通過調(diào)
用Thread類的 start()方法來啟動一個線程胞皱,這時此線程處于就緒(可運行)狀態(tài)邪意,并沒有運行,一旦得到cpu時間片反砌,就開始
執(zhí)行run()方法雾鬼,這里方法 run()稱為線程體,它包含了要執(zhí)行的這個線程的內(nèi)容宴树,Run方法運行結(jié)束策菜,此線程隨即終止。
2.run():
publicclassThreadextendsObjectimplementsRunnable
如果該線程是使用獨立的Runnable運行對象構(gòu)造的,則調(diào)用該Runnable對象的run方法又憨;否則翠霍,該方法不執(zhí)行任何操作并返回。
Thread的子類應該重寫該方法蠢莺。
run()方法只是類的一個普通方法而已寒匙,如果直接調(diào)用Run方法,程序中依然只有主線程這一個線程躏将,其程序執(zhí)行路徑還是只有
一條锄弱,還是要順序執(zhí)行,還是要等待run方法體執(zhí)行完畢后才可繼續(xù)執(zhí)行下面的代碼祸憋,這樣就沒有達到寫線程的目的会宪。
總結(jié)
調(diào)用start方法方可啟動線程,而run方法只是thread的一個普通方法調(diào)用蚯窥,還是在主線程里執(zhí)行掸鹅。
Thread thread=new Thread(){?
?@Override?
?public void run() {?
? ? ?testPwd();
? ? ?}
?};
? //? thread.start();
? ? ?thread.run();
? ? System.out.print("啟動線程...");
?}?
//? 測試線程方法?
static void testPwd(){?
? ? ?System.out.println("是否進來...");?
}
?thread.start();
啟動線程...是否進來...
?thread.run();
?是否進來...
11:01:39.720 [新線程] INFO com.whjz.workstation.RunnableT - 線程名:新線程
啟動線程...11:01:39.720 [新線程] INFO com.whjz.workstation.RunnableT - 線程名:新線程
11:01:39.720 [新線程] INFO com.whjz.workstation.RunnableT - 線程名:新線程