start() :
它的作用是啟動(dòng)一個(gè)新線(xiàn)程。
通過(guò)start()方法來(lái)啟動(dòng)的新線(xiàn)程,處于就緒(可運(yùn)行)狀態(tài),并沒(méi)有運(yùn)行,一旦得到cpu時(shí)間片,就開(kāi)始執(zhí)行相應(yīng)線(xiàn)程的run()方法,這里方法run()稱(chēng)為線(xiàn)程體,它包含了要執(zhí)行的這個(gè)線(xiàn)程的內(nèi)容,run方法運(yùn)行結(jié)束,此線(xiàn)程隨即終止。start()不能被重復(fù)調(diào)用。用start方法來(lái)啟動(dòng)線(xiàn)程,真正實(shí)現(xiàn)了多線(xiàn)程運(yùn)行,即無(wú)需等待某個(gè)線(xiàn)程的run方法體代碼執(zhí)行完畢就直接繼續(xù)執(zhí)行下面的代碼。這里無(wú)需等待run方法執(zhí)行完畢,即可繼續(xù)執(zhí)行下面的代碼,即進(jìn)行了線(xiàn)程切換。
run() :
run()就和普通的成員方法一樣,可以被重復(fù)調(diào)用。
如果直接調(diào)用run方法,并不會(huì)啟動(dòng)新線(xiàn)程!程序中依然只有主線(xiàn)程這一個(gè)線(xiàn)程,其程序執(zhí)行路徑還是只有一條,還是要順序執(zhí)行,還是要等待run方法體執(zhí)行完畢后才可繼續(xù)執(zhí)行下面的代碼,這樣就沒(méi)有達(dá)到多線(xiàn)程的目的。
總結(jié):調(diào)用start方法方可啟動(dòng)線(xiàn)程,而run方法只是thread的一個(gè)普通方法調(diào)用,還是在主線(xiàn)程里執(zhí)行。
public class Test {
static void pong(){
System.out.print("pong");
}
public static void main(String[] args) {
Thread t=new Thread(){
public void run(){
pong();
}
};
t.run();
System.out.print("ping");
}
}
運(yùn)行結(jié)果:
pongping
總結(jié)一下:
- start() 可以啟動(dòng)一個(gè)新線(xiàn)程,run()不能
- start()不能被重復(fù)調(diào)用,run()可以
- start()中的run代碼可以不執(zhí)行完就繼續(xù)執(zhí)行下面的代碼,即進(jìn)行了線(xiàn)程切換。直接調(diào)用run方法必須等待其代碼全部執(zhí)行完才能繼續(xù)執(zhí)行下面的代碼。
- start() 實(shí)現(xiàn)了多線(xiàn)程,run()沒(méi)有實(shí)現(xiàn)多線(xiàn)程。