多線程之淺談線程概念

                                                                                                多線程之淺談線程概念

          要學習一個技術我們首先是要理解其本質的定義,只有這樣的前提下你才能更快更準確的去學習和使用他,爲了更好的去學習多線程我們必去先  明白什麼是線程,我將會依依說明爲什麼要依次理解的原因。


      首先們我來看看2個w一個h的問題,
      1什麼是多線程?

      2爲什麼要用多線程?

      3怎麼使用多線程?


    第一個問題的官方回答是:

    多線程(英語:multithreading),是指從軟件或者硬件上實現多個線程併發執行的技術。從簡單的文字的定義上看,好像就是同時做“多件事”,而實際情況就是這樣,只是它裏面還有更多要注意的細節和有趣的事情。


在聊聊第2個問題,標準回答是:

    1.耗時的操作使用線程,提高應用程序響應

    2.並行操作時使用線程,如C/S架構的服務器端併發線程響應用戶的請求。

    3.多CPU系統中,使用線程提高CPU利用率

    4.改善程序結構。一個既長又複雜的進程可以考慮分爲多個線程,成爲幾個獨立或半獨
立的運行部分,這樣的程序會利於理解和修改。


         以上對這兩個問題的回答比較的生硬和官方,我個人並不喜歡這樣的回答,因爲不能“個性本地化”的理解,我認爲上述的前兩個問題應該是一個問題,而要回答這個問題我們來聊聊多線程的歷史。

         簡單來說任何技術都是來滿足人類“惰性”的慾望,多線程也不例外,1960就開始有了多線程的思想,爲了便於理解請看一個例子:
小明每天早上6點從起牀到去上學6點半需要做以下事情:1起牀穿衣 2洗漱 3早餐,4唱歌(不去管爲什麼要唱歌),而有一天他6點10分才起牀爲了不遲到他想到把唱歌這件事在穿衣服的時候可以一起做,這樣在同一時間去做兩件事就可以縮短時間。

        這個例子就能很好的演示多線程思想的誕生,就是爲了提高效率,縮短做事的時間,這就其實很好的解答了第2個問題,而一個技術的本身的特性跟它所需要解決的問題是分不開的,可以這麼說需求決定了一個技術的特性,什麼是多線程?就是併發運行多個線程,而這個問題的關鍵是又引發了一個問題,那什麼又是線程?從上面的小明的例子來看,我們可以確定的是線程一定有兩個重要的因素:1任務 2時間  ,小明需要做的每一個事情就是一個任務,要完成這些任務一定有一個時間段(不管這個時間段的長短),我們再來看看官方對線程的定義和組成:

     線程,有時被稱爲輕量級進程(Lightweight Process,LWP),是程序執行流的最小單元。一個標準的線程由線程ID,當前指令指針(PC),寄存器集合和堆棧組成。

    對於這個定義我並不是很喜歡因爲他是從程序的單位大小去說明,相對而言我覺得這麼說更好些:

   線程是指程序的一個指令執行序列!

     沒錯,線程就是多個任務按一定的順序去排列執行,這就像一個編劇寫好了一個劇本(任務),導演和演員去實現這些劇本的情節,而拍出來的電影就是線程,這裏大家有沒發現一個很有趣的本質,電影其實就是把N個鏡頭按順序播放,那劇本和電影有什麼本質區別?或者說說任務和線程有什麼區別?這個問題很多人都分不清,就連think in java的作者也說自己當初經常分不清楚兩者的區別,我認爲它們的區別在於:時間。如果沒有時間那麼任務就沒法執行,電影也沒法拍攝,要深刻的理解這點很重要,因爲基本的概念理解決定你對技術本身的使用方式。


       而後面也解釋了線程的組成,這裏我簡單的說明,在後面我會專門開一片線程組成的深入研究,線程id就像一個人的身份證一樣這個就不說了,指令指針就是我們理解的“任務”(這裏暫且這麼理解),寄存器集合和堆棧就是拍電影的“場地”。


     要回答最後一個問題有一個前提:那就是你會使用線程,在這前提下還有一個前提是:你知道什麼是線程。所以要回答最後這個問題這將是整個多線程系列最終要回答的問題。

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