備註:閱讀本部落格之前,需要具備一點物件導向程式設計的知識(很少的一部分,別慌)
什麼是多程式?
比如你可以一邊聽網易音樂,一邊聊天;這是兩個不同的程式,這就是多程式;
但是上文說某一時刻CPU只能幹一件事情,是否矛盾?
在作業系統的管理下,所有正在執行的程式輪流使用CPU,每個程式允許佔用CPU的時間非常短(比如1毫秒),這樣使用者根本感覺不出來 CPU是在輪流為多個程式服務,就好象所有的程式都在不間斷地執行一樣,給使用者的感覺就是並行。但實際上在任何一個時間內有且僅有一個程式佔有CPU(這就是實現併發技術的時間片輪流排程演算法)。
我們究竟應該如何理解程式,理解程式,理解執行緒呢?下面講解一些我個人對於程式,對於程式,對於執行緒的理解:
從另一個角度看程式和程式
假如對於QQ這個應用程式(注意這裡我們稱其為程式),張三可以登入他自己的QQ,李四也可以在同一臺電腦上,同一個系統下登入他的QQ;再比如,同一個 瀏覽器你也可以開啟兩次;注意,我們在QQ未執行的時候,並沒有說:這是張三的QQ,或者這是李四的QQ,我們給它取了個名字:QQ應用程式;瀏覽器也可以同時開啟兩次;但我們並沒有因此而區分他們,我們仍然管"他們''叫做瀏覽器。可這和我們理解程式和程式有什麼關係呢?
學習c++或者Java的時候,我們學習類這個概念, 並學習瞭如何建立類;也學習了物件這個概念,並認識到物件是類的例項化 ,說到這裡的時候,是否有些明白?不明白我再講的具體一些:
學習建立類的時候,我們知道,建立一個類並不為這個類分配記憶體;而根據這個類來建立一個物件的時候,則是分配了記憶體;而且一個類是可以建立多個物件的。有沒有發現這和程式和程式的概念有些相似.
對於桌面上的未開啟的 QQ應用程式,就如同我們建立的一個類,我們暫且把它 稱為 QQ類 吧;寫QQ應用軟體的過程,就如同建立一個類的過程; 桌面上未開啟的QQ應用程式 是裝在磁碟裡面的吧,並沒有為其分配記憶體空間吧;而當我們開啟它,並登入張三的賬號的時候,實際上就如同一個類建立了一個物件一個;我們不妨把這個物件稱之為:張三QQ 吧,那麼你也知道,這個張三QQ 物件是 佔了記憶體空間的;而這個開啟的 張三QQ 物件,我們給它的稱呼就是:程式;當然針對同一個QQ應用程式,你同樣可以建立一個:李四QQ 程式;這就如同一個類例項化多個物件一樣。
也就是從本質上講:程式是程式在記憶體中的例項化!!!雖然這個例項化的過程是相當的複雜,涉及到作業系統多方面的知識,但是其本質並未發生
上面的例子中,將程式比作宣告的類,將程式比作類的例項化:物件。那麼執行緒又該處於一個什麼地位呢?回顧一下我們類的組成:成員變數和成員方法。我們再來問這樣一個問題:當我們要用類來實現一個功能的時候,我們是通過誰來實現的?
毫無疑問,我們必須先例項化一個物件,因為類只是一個抽象概念,你連記憶體空間都沒有,你說尼瑪呢?例項化了一個物件後,我們具備實現一個功能的條件,但是實現這個功能是通過物件實現的嗎?顯然不是,你建立了類,或許呼叫了建構函式,或許為該物件進行了相關配置;但是接觸過物件導向的人都知道,是類方法,也就是最終我們實現某一個功能,落腳到了類方法,比如,我們要改變某個類成員,或者完成與其他物件的互動,是通過類方法來完成這件事情的,因此,類方法就就類比到了:執行緒。(其實你仔細想想:當一個函式被呼叫的時候,程式計數器發生的改變(儲存並跳轉),堆疊的改變(重新為新的函式建立棧).....你有沒有思考過,這個過程和執行緒排程時底層發生的事件是何其的相似啊!!!)
也就是物件保證了我們有記憶體空間(就像程式提供了資源一樣);但最終的實現是通過類方法來實現功能的,而這,就是執行緒。
轉載請註明出處,謝謝,如有不懂或者見解,請留言!