理解線程,就會由單線程向多線程進軍

如今,智能手機與我們的生活密不可分。智能手機之所以這樣吸引我們,與其能提供豐富多彩的應用程序有密切的關係。在使用這些應用程序,如查閱資訊、單擊圖標、拉取列表、播放視頻和音樂等時,會給人們以視覺和聽覺上的享受。同時,智能手機能及時地對我們的操作進行反饋,非常友好。這裏的每一次反饋,都可能是有一個線程在專心致志地爲我們服務。所以,看似陌生的線程實際上已經默默服務人們多時。

每一個剛接觸程序設計的初級人員,在學習了某種編程語言後都會開始嘗試編寫一些基本的短小的代碼段。在Java 中,這些短小的代碼段一般會被放入一個class,然後保存到一個擴展名爲 .java 的文件中;之後通過命令行或集成開發環境工具的編譯,生成 .class文件並讓這個 .class文件運行起來,得到我們想要的結果。例如,有一個簡單的模仿遊戲打開寶箱得到禮品的程序代碼,參考如下:

我們將其以文件形式保存到系統中,如圖 1.1 所示。

 已經保存到系統的 Java 的類文件

這樣,該文件中就包含了我們想要運行的一小段程序。當使用 Java 的命令或單擊集成開發環境的run按鈕時,程序就會運行起來,並且按照編寫好的邏輯反饋相關信息。OpenBox 的運行結果如圖所示。

以上這些看似簡單的操作過程,可以讓我們更好地理解以下幾個概念:程序、進程、線程。

程序可以理解爲個人的思維整合所設計和編寫的一種有特殊意義的文本作品,其包含一些有特殊含義的詞彙、符號、數據及短語縮寫,俗稱代碼。程序本身是一種靜態的文本作品,但通過特殊的環境,能讓其產生動態的邏輯和具備運算能力。

上文中的 OpenBox.java 文件中的文本內容就是程序。

進程則是對某程序的運行過程。一般地,一份程序的一次運行能產生一個進程,進程是一個動態的概念。進程的運行是需要用到程序的內容的,更確切地說,進程的運行離不開程序,離不開程序中有特殊含義的文本。實際上,進程運行中有專門存放這些文本的區域,該區域稱爲代碼文本區域。程序與進程是一對多的關係,即一個程序可以同時運行一個或多個進程。單擊集成開發環境的 run 按鈕時,OpenBox.java 對應的一個進程就立刻產生了。

理解好程序和進程的關係,就可以對線程加以描述和解釋。線程是比進程更細小的一級劃分,線程可以利用進程所擁有的資源,並且能獨立完成一項任務,如計算、輸出顯示信息等。在引入線程的操作系統中,通常是把進程作爲分配資源的基本單位,而把線程作爲獨立運行和獨立調度的基本單位。進程與線程也是一對多的關係,即一個進程中至少有一個線程與之對應。如果一個進程中有多個線程同時存在,那麼就是多線程的進程。上面的OpenBox.java 程序運行時,其在產生一個進程的同時,也產生了一個單線程與之對應。也就是說,當運行 OpenBox.java程序時,該行爲所產生的進程是一個單線程進程。

程序、進程、線程的關係如圖所示。

程序、進程、線程的關係

知識拓展:

近年來,隨着大數據的興起,對於大數據的處理要求比傳統的普通數據處理要求有了更高的標準,Java 在大數據的處理方面也在不斷地優化,特別是在開源社區中,許多開發貢獻者提供了許多大數據處理相關的組件和中間件。其中一個稱爲 quasar 的組件實現了 Java 的纖程。纖程是比線程更小的一級劃分,它所佔用的系統資源更少,可以理解爲更輕量級的一種特殊線程。一般地,從佔用系統資源的大小方面來說,可以這樣排序:進程 > 線程 > 纖程。本小節不展開對纖程的介紹,有興趣的讀者可以通過 quasar 的開源地址(https://github.com/puniverse/quasar)瞭解相關內容。


  推薦閱讀  

北京大學出版社

《Java 多線程與大數據處理實戰

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章