“你好,阿米戈!我們有一個新的且非常困難的主題。對不起。它通常被認為是最複雜的主題之一,不僅在 Java 中,而且在一般編程中也是如此。我說的是多線程

想像一個典型的電腦遊戲,例如太空飛船賽車遊戲。你正在浩瀚的宇宙中飛行,躲避隕石和巡邏巡洋艦。還有兩打人和你一起參加這些非法比賽。

假設您決定編寫這樣的遊戲。您的程序必須跟踪命令(鍵盤輸入)、移動宇宙飛船、計算它們的軌跡、確定任何碰撞的後果,並將所有這些繪製在用戶的屏幕上。這是一項非常複雜的工作。

還記得我們如何在成長中的航運公司的例子中解決“非常複雜的問題”嗎?

我們將其劃分為獨立的部門並嚴格指定(標準化)它們如何交互。

“但是當獨立部分必須與其他部分並行執行某些工作時,我們該怎麼辦?!這個問題的答案是線程。”

嘗試將程序想像成圍繞代碼運行並執行命令的小型機器人。首先,它在一行上執行命令,然後移動到下一行,依此類推。

“我可以在腦海中看到它。小菜一碟!”

“很好。現在想像你有幾個這樣的機器人。當一個處理用戶輸入時,第二個正在根據該輸入更新對象。第三個執行代碼以在屏幕上顯示這些對象。每秒幾次,第四個檢查是否有任何船隻發生碰撞,如果發生碰撞,則計算碰撞結果。”

因此,我們不僅可以將程序劃分為獨立的部分/對象,而且可以使這些部分/對象可以彼此獨立地執行它們的工作。各個部分之間的交互越少,程序就越不復雜。

想像一下,您能夠用 發送信件的腳本替換經理。公司的其他部門甚至都看不出有什麼變化。這種事情早在26世紀就發生了,而且效果很好。大多數經理,甚至是高級管理人員,都可以被一個複雜度一般的腳本成功取代。只有在“辦公室浮游生物聯盟”介入後,管理人員的大規模裁員才告一段落。但我離題了。

“多麼有趣!”

“不僅可以有幾個這樣的‘小機器人’執行代碼,它們還可以相互交流並產生新的機器人。”

“產生新的機器人?”

“是的,執行新任務。有時創建另一個機器人(另一個線程)與當前線程(機器人)同時執行某些動作是有利的。”

這聽起來是個好東西,但我想不出我會用在什麼地方。

為什麼我們稱它們為“線程”?

“想像一下,每個機器人都是不同的顏色,並在執行命令時用它的顏色標記命令。小機器人所走的路徑就像鉛筆留下的線一樣。這條路徑在機器人後面串起來,就像後面的線一樣一根針。”

每個“小機器人”都有一個任務,它被創建來執行。您可以認為線程是執行此任務時執行的一組命令。

假設您乘坐宇宙飛船運送貨物。那麼 «delivery cargo» 就是你的任務,你正在執行它。你的飛行路徑就是你的線程。我們可以說每個新任務,每個尚未完成的任務,都有自己的線程(仍然需要遍歷的路徑)。

“換句話說,有一個任務和一個執行它的‘小機器人’。而線程就是機器人完成任務時所走的路徑?”

“確切地。”

這就是一切在內心深處運作的方式。因為計算機只有一個處理器,所以一次只能執行一個命令。所以這是發生了什麼:處理器不斷地在線程之間切換。它切換到一個新線程,執行一些命令,然後切換到下一個線程,執行一些命令,等等。但是由於線程之間的切換每秒發生數百次,因此在我們看來所有線程都在同時運行。

多線程 - 1