課程
/后端開發
/Java
/深入淺出Java多線程
如下圖所示,調用的兩個線程while循環都沒有運行,難度是因為KeepRunning直接為false嗎?但是從顯示的執行順序來看,應該false傳入是在后面。求解答
2017-01-04
源自:深入淺出Java多線程 2-5
正在回答
java多線程可以近似看成同時執行,不過本質上計算機能同時工作的線程數是有限個的(取決于你的CPU)
老師演示的時候農民軍和隋軍交替結果看起來應該是至少有兩個線程是同時工作的。而你這個明顯是僅分配給了這個程序一個線程。
多線程是為了解決某些應用上需要等待其他的結果(比如瀏覽器訪問一個網址需要等待服務器返回HTML文件才能繼續執行顯示頁面的操作)才能繼續執行,那么這段時間cpu可以去執行其他線程的程序。但是如果這個線程可以一口氣執行下去的話,中途其他線程是沒有辦法執行的。
-----------------以下是針對代碼的--------------------------
你只有一個線程能同時工作。那么兩個軍隊的線程啟動后是處于等待狀態的,并沒有真的執行。
然后舞臺線程沒有看見sleep(就是你刪去的那個)所以繼續執行下去,輸出,關鍵人物的生命,設置名字,再一個輸出,然后直接就執行到了keeprunning=false的兩句。
再之后看見sleep,關鍵人物線程和兩個軍隊線程爭用cpu,不過兩個軍隊線程即使爭用到cpu也會因為keeprunning導致線程直接結束,那么舞臺線程休眠的時間(這個是確定的值,沒到的話再找個線程執行)就只有關鍵人物有輸出操作,關鍵人物操作以后舞臺線程也到了時間的話,舞臺線程占用cpu,繼續執行。
java初學,為個人理解所得,dalao請輕噴
慕粉2220415365 提問者
bbug 回復 慕粉2220415365 提問者
慕粉2220415365 提問者 回復 bbug
看明白了,總結一下。Stage線程是一個總線程,在運行期間調用兩個軍隊的線程和關鍵人物的線程,按照Stage總線程的執行順序,若Stage線程不休眠的話,Stage線程會一直執行下去,兩個軍隊的線程會在Stage線程執行完再進行;在Stage線程執行完前Boolean變量設為false,因此兩個軍隊線程執行時沒有輸出,關鍵人物有輸出是因為調用了join()方法
因為你沒有將舞臺線程休眠,農民和隋軍線程開始后,兩個線程都處于可運行狀態,而舞臺線程也是如此,cpu選擇線程是隨機的(在沒有設置優先級時),從你的結果來看,cpu選擇了舞臺線程,創建了程咬金,并在陳咬金說出:“希望人們安居樂業”后,又選擇了農民和隋軍進程,即開始打仗,我覺得我講的是比那個最佳答案好的,你覺得呢
理論上說都會兩個軍隊進程都會執行完一個while循環吧?
舉報
帶你一起深入淺出多線程,掌握基礎,展望進階路線
1 回答為什么thread是單獨地休眠舞臺,軍隊和農民軍不休眠?
2 回答為什么舞臺都休眠了 隋軍和起義軍的線程還在繼續運行呢?
2 回答求問在設置完兩個false之后調用農民軍的join方法,如果本來農民軍直接完成戰斗,那隋軍不是可能不能結束戰斗?
1 回答舞臺休眠了,軍隊是在舞臺的run方法里,不也會跟著休眠嗎
3 回答為什么Thread.sleep(50)休眠的就是舞臺線程而不是其他的?
Copyright ? 2025 imooc.com All Rights Reserved | 京ICP備12003892號-11 京公網安備11010802030151號
購課補貼聯系客服咨詢優惠詳情
慕課網APP您的移動學習伙伴
掃描二維碼關注慕課網微信公眾號
2017-01-06
java多線程可以近似看成同時執行,不過本質上計算機能同時工作的線程數是有限個的(取決于你的CPU)
老師演示的時候農民軍和隋軍交替結果看起來應該是至少有兩個線程是同時工作的。而你這個明顯是僅分配給了這個程序一個線程。
多線程是為了解決某些應用上需要等待其他的結果(比如瀏覽器訪問一個網址需要等待服務器返回HTML文件才能繼續執行顯示頁面的操作)才能繼續執行,那么這段時間cpu可以去執行其他線程的程序。但是如果這個線程可以一口氣執行下去的話,中途其他線程是沒有辦法執行的。
-----------------以下是針對代碼的--------------------------
你只有一個線程能同時工作。那么兩個軍隊的線程啟動后是處于等待狀態的,并沒有真的執行。
然后舞臺線程沒有看見sleep(就是你刪去的那個)所以繼續執行下去,輸出,關鍵人物的生命,設置名字,再一個輸出,然后直接就執行到了keeprunning=false的兩句。
再之后看見sleep,關鍵人物線程和兩個軍隊線程爭用cpu,不過兩個軍隊線程即使爭用到cpu也會因為keeprunning導致線程直接結束,那么舞臺線程休眠的時間(這個是確定的值,沒到的話再找個線程執行)就只有關鍵人物有輸出操作,關鍵人物操作以后舞臺線程也到了時間的話,舞臺線程占用cpu,繼續執行。
java初學,為個人理解所得,dalao請輕噴
2017-05-05
看明白了,總結一下。Stage線程是一個總線程,在運行期間調用兩個軍隊的線程和關鍵人物的線程,按照Stage總線程的執行順序,若Stage線程不休眠的話,Stage線程會一直執行下去,兩個軍隊的線程會在Stage線程執行完再進行;在Stage線程執行完前Boolean變量設為false,因此兩個軍隊線程執行時沒有輸出,關鍵人物有輸出是因為調用了join()方法
2017-03-09
因為你沒有將舞臺線程休眠,農民和隋軍線程開始后,兩個線程都處于可運行狀態,而舞臺線程也是如此,cpu選擇線程是隨機的(在沒有設置優先級時),從你的結果來看,cpu選擇了舞臺線程,創建了程咬金,并在陳咬金說出:“希望人們安居樂業”后,又選擇了農民和隋軍進程,即開始打仗,我覺得我講的是比那個最佳答案好的,你覺得呢
2017-01-15
理論上說都會兩個軍隊進程都會執行完一個while循環吧?