start():通過該方法啟動(dòng)線程的同時(shí)也創(chuàng)建了一個(gè)線程吨灭,真正實(shí)現(xiàn)了多線程,這是無需等待run()方法中的代碼執(zhí)行完畢就可以直接執(zhí)行線程外面的代碼,通過start創(chuàng)建的線程處于可運(yùn)行狀態(tài)刑巧,當(dāng)?shù)玫紺PU時(shí)間片后就會(huì)執(zhí)行其中的run方法喧兄, 這里方法run()稱為線程體,它包含了要執(zhí)行的這個(gè)線程的內(nèi)容啊楚,Run方法運(yùn)行結(jié)束吠冤, 此線程隨即終止。
run():在當(dāng)前線程開啟,比如當(dāng)前線程是主線程,那么運(yùn)行在主線程,如果當(dāng)前線程是子線程恭理,那么在子線程運(yùn)行拯辙。還是要順序執(zhí)行缴饭,還是要等待run方法體執(zhí)行完畢后才可繼續(xù)執(zhí)行下面的代碼吁脱,這樣就沒有達(dá)到寫線程的目的。
示范一:在主線程通過start方法開啟線程
new Thread(new Runnable() {
@Override
public void run() {//Thread-5878
System.out.println("====本線程是通過start方式開啟的,會(huì)單獨(dú)開啟一個(gè)線程==1==="+currentThread().getName());
}
}).start();
示范二:在主線程通過run方法開啟線程
new Thread(new Runnable() {//Thread-main
@Override
public void run() {
System.out.println("====本線程是通過在主線程中run方式開啟的,并沒有創(chuàng)建一個(gè)線程==2==="+currentThread().getName());
}
}).run();//run開啟是在當(dāng)前線程
示范三:在子線程通過run方法開啟新線程
new Thread(new Runnable() {
@Override
public void run() {
new Thread(new Runnable() {
@Override
public void run() {//run是在當(dāng)前線程運(yùn)行也就是外層的子線程 Thread-5880
System.out.println("====本線程是通過在子線程中通過run方式開啟的,并沒有創(chuàng)建一個(gè)線程==3==="+currentThread().getName());
}
}).run();//run開啟是在當(dāng)前線程
}
}).start();
上面三種方式,其執(zhí)行順序是:
第一組數(shù)據(jù):
====本線程是通過在主線程中run方式開啟的,并沒有創(chuàng)建一個(gè)線程==2===main
====本線程是通過在子線程中通過run方式開啟的,并沒有創(chuàng)建一個(gè)線程==3===Thread-5880
====本線程是通過start方式開啟的,會(huì)單獨(dú)開啟一個(gè)線程==1===Thread-5878
第二組數(shù)據(jù):
====本線程是通過在主線程中run方式開啟的,并沒有創(chuàng)建一個(gè)線程==2===main
====本線程是通過start方式開啟的,會(huì)單獨(dú)開啟一個(gè)線程==1===Thread-5882
====本線程是通過在子線程中通過run方式開啟的,并沒有創(chuàng)建一個(gè)線程==3===Thread-5884
其中第二種運(yùn)行在主線程,第一種和三種運(yùn)行在子線程钞诡。二三執(zhí)行的先后順序不確定周伦。