我的一些見(jiàn)解
public?class?Stage?extends?Thread?{
????public?void?run(){
????????ArmyRunnable?armyTaskOfSuiDynasty?=?new?ArmyRunnable();
????????ArmyRunnable?aryTaskOfRevolt?=?new?ArmyRunnable();
????????//使用Runnable對(duì)象接口創(chuàng)建線程
????????Thread?armyOfSuiDynasty?=?new?Thread(armyTaskOfSuiDynasty,"隋軍");
????????Thread?aryOfRevolt?=?new?Thread(aryTaskOfRevolt,"起義軍");
????????//啟動(dòng)
????????armyOfSuiDynasty.start();
????????aryOfRevolt.start();
????????System.out.println("帷幕拉開(kāi),表演開(kāi)始");
????????//舞臺(tái)線程休眠
????????try?{
????????????Thread.sleep(50);
????????}?catch?(InterruptedException?e)?{
????????????e.printStackTrace();
????????}
????????armyTaskOfSuiDynasty.keepRunning?=?false;
????????aryTaskOfRevolt.keepRunning?=?false;
????????try?{
????????????//主線程等待2個(gè)線程結(jié)束
????????????armyOfSuiDynasty.join();
????????????aryOfRevolt.join();
????????}?catch?(InterruptedException?e)?{
????????????e.printStackTrace();
????????}
????????System.out.println("關(guān)閉舞臺(tái)");
????}
????public?static?void?main(String[]?args)?{
????????Stage?stage?=?new?Stage();
????????stage.setName("舞臺(tái)");
????????stage.start();
????}
}一開(kāi)始看完后有點(diǎn)懵。仔細(xì)想了想,運(yùn)行了幾次,一點(diǎn)小理解。
首先,main方法啟動(dòng)了舞臺(tái)線程,執(zhí)行run方法。
順著順序執(zhí)行到舞臺(tái)線程休眠(50毫秒),這個(gè)時(shí)候給了隋軍和起義軍這兩個(gè)線程使用處理器資源的時(shí)間(前期雖然有2個(gè)線程都已經(jīng)開(kāi)始,但他們沒(méi)有處理器使用權(quán)),所以這兩個(gè)線程中的一個(gè)會(huì)首先執(zhí)行,因?yàn)閒or循環(huán)中有yield,所以處理器在50毫秒之內(nèi)被2個(gè)線程隨機(jī)使用,50毫秒以后,舞臺(tái)線程也加入處理器的爭(zhēng)取中,一旦爭(zhēng)取到了? 就會(huì)往下執(zhí)行,keepRunning設(shè)置為false,然后兩個(gè)線程執(zhí)行join方法。當(dāng)兩個(gè)線程都停止后,舞臺(tái)線程繼續(xù)執(zhí)行直到結(jié)束。
2019-05-21
兄弟你牛啊,聽(tīng)了你的解釋后,恍然大悟啊
2019-05-11
哦哦哦