[Object-oriented] 執行緒

[Object-oriented] : 執行緒


前言 :

執行緒
在物件導向裡是很少被討論到的東西。
不是因為物件導向沒有用到執行緒,而是因為執行緒是物件導向底層的程式設計的內容。
或者是換個角度說。執行緒是所有程式設計開發應該懂的內容,開發出來的程式都是在執行緒上面執行。
筆者試著從計算機物理層面,來解釋執行緒的運作。


單執行緒 :

在[Object-oriented] 相關系列的文章中,已經闡述過,
程式的執行時其實是,
可以這樣理解 :

image


程式碼在記憶體內,然後由電腦一行一行去執行。
這一行一行執行串聯起來的動作,其實就是所謂的執行緒。
也就是說圖中紅線的部分就是最簡單的單執行緒。


多執行緒 :

多執行緒主要是用在有些時候很多工作要一起執行,而不是執行完一個在去執行下一個。
理想上可以把多執行緒,看成有多個單執行緒一起執行。
可以這樣理解 :

image


但是受限各種軟硬體的限制,電腦一次只能執行一行程式碼。
於是工程師們在電腦系統內多加了一個分工器。
這個分工器的工作,就是讓電腦執行完A執行緒的一行程式碼之後,改去執行B執行緒的一行程式碼。
可以這樣理解 :

image
image
image
image


因為是輪流執行每個執行緒的一行程式碼,在快速的切換下感覺就會像是同時執行。
這也就是最基本的多執行緒雛型。


這邊倒是要特別說明,分工器只是一個觀念。
在實做上,
有分是用硬體去實現、或是用軟體去實現,甚至多核心該怎麼實現。
也有分是一次執行一行程式碼、或是一次執行幾秒,來做切換到下一條執行緒的動作。
這些是比較進階的知識,彷間有不少文章都有做詳細的說明。


視窗執行緒 :

視窗執行緒就是我們一般常見到的WindowForm應用程式用的執行緒。
WindowForm應用程式有很多又要描繪畫面,又要接受滑鼠鍵盤等硬體裝置的輸入。
這些工作都是要同時進行操做起來才會順暢,但是為了這個建立多執行緒又會讓程式變得太複雜。
於是工程師們在視窗應用程式內,以單執行緒為基礎並且多加了一個訊息幫浦。
這個訊息幫浦的工作,就是讓電腦將要執行的事先存起來,然後有空的時候再去取出來執行。
可以這樣理解 :

image
image
image


視窗執行緒的這種做法,讓單執行緒也可以完成多執行緒的部分工作。
其實這也是一個好用的執行緒Pattern,開發的時候拿來套用,可以降低不少多執行緒的複雜度。


後記 :

本篇的文章,
描述了執行緒的運作,希望對大家有幫助^^


P.S.
本篇的內容大幅度的簡化了計算機結構的內容,用以傳達執行緒的概念。
實際電腦系統在運作的時候,比本篇說明的複雜很多 ^^"。

期許自己
能以更簡潔的文字與程式碼,傳達出程式設計背後的精神。
真正做到「以形寫神」的境界。