我的一些見解
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("帷幕拉開,表演開始"); ????????//舞臺(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(); ????} }
一開始看完后有點(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)開始,但他們沒有處理器使用權(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
兄弟你牛啊,聽了你的解釋后,恍然大悟啊
2019-05-11
哦哦哦