什么是多線程?

多線程是一個比較輕量級的方法來實現(xiàn)單個應(yīng)用程序內(nèi)多個代碼執(zhí)行路徑。在系統(tǒng)級別內(nèi)怔软,程序并排執(zhí)行冬筒,系統(tǒng)分配到每個程序的執(zhí)行時間是基于該程序的所需時間和其他程序的所需時間來決定的赘风。然而在每個應(yīng)程序的內(nèi)部,存在一個或多個執(zhí)行線程,它同時或在一個幾乎同時發(fā)生的方式里執(zhí)行不同的任務(wù)沐悦。

無論是哪種語言開發(fā)的程序最終往往轉(zhuǎn)換成匯編語言進(jìn)而解釋成機(jī)器碼來執(zhí)行包归。但是機(jī)器碼是按順序執(zhí)行的哄褒,一個復(fù)雜的多步操作只能一步步按順序逐個執(zhí)行矢腻。改變這種狀況可以從兩個角度出發(fā):對于單核處理器敲茄,可以將多個步驟放到不同的線程,這樣一來用戶完成UI操作后其他后續(xù)任務(wù)在其他線程中副签,當(dāng)CPU空閑時會繼續(xù)執(zhí)行遥椿,而此時對于用戶而言可以繼續(xù)進(jìn)行其他操作;對于多核處理器淆储,如果用戶在UI線程中完成某個操作之后冠场,其他后續(xù)操作在別的線程中繼續(xù)執(zhí)行,用戶同樣可以繼續(xù)進(jìn)行其他UI操作本砰,與此同時前一個操作的后續(xù)任務(wù)可以分散到多個空閑CPU中繼續(xù)執(zhí)行(當(dāng)然具體調(diào)度順序要根據(jù)程序設(shè)計而定)碴裙,及解決了線程阻塞又提高了運行效率。

當(dāng)用戶播放音頻点额、下載資源舔株、進(jìn)行圖像處理時往往希望做這些事情的時候其他操作不會被中斷或者希望這些操作過程中更加順暢。在單線程中一個線程只能做一件事情还棱,一件事情處理不完另一件事就不能開始载慈,這樣勢必影響用戶體驗。早在單核處理器時期就有多線程珍手,這個時候多線程更多的用于解決線程阻塞造成的用戶等待(通常是操作完UI后用戶不再干涉办铡,其他線程在等待隊列中,CPU一旦空閑就繼續(xù)執(zhí)行琳要,不影響用戶其他UI操作)寡具,其處理能力并沒有明顯的變化。如今無論是移動操作系統(tǒng)還是PC稚补、服務(wù)器都是多核處理器童叠,于是“并行運算”就更多的被提及。一件事情我們可以分成多個步驟孔厉,在沒有順序要求的情況下使用多線程既能解決線程阻塞又能充分利用多核處理器運行能力。

下圖反映了一個包含8個操作的任務(wù)在一個有兩核心的CPU中創(chuàng)建四個線程運行的情況帖努。假設(shè)每個核心有兩個線程撰豺,那么每個CPU中兩個線程會交替執(zhí)行,兩個CPU之間的操作會并行運算拼余。單就一個CPU而言兩個線程可以解決線程阻塞造成的不流暢問題污桦,其本身運行效率并沒有提高,多CPU的并行運算才真正解決了運行效率問題匙监,這也正是并發(fā)和并行的區(qū)別凡橱。當(dāng)然小作,不管是多核還是單核開發(fā)人員不用過多的擔(dān)心,因為任務(wù)具體分配給幾個CPU運算是由系統(tǒng)調(diào)度的稼钩,開發(fā)人員不用過多關(guān)心系統(tǒng)有幾個CPU顾稀。開發(fā)人員需要關(guān)心的是線程之間的依賴關(guān)系,因為有些操作必須在某個操作完成完才能執(zhí)行坝撑,如果不能保證這個順序勢必會造成程序問題静秆。

多線程原理

有些程序是一條直線,起點到終點巡李;有些程序是一個圓抚笔,不斷循環(huán),直到將它切斷侨拦。直線的如簡單的Hello World殊橙,運行打印完,它的生命周期便結(jié)束了,像曇花一現(xiàn)那樣狱从;圓如操作系統(tǒng)膨蛮,一直運行直到你關(guān)機(jī)。
一個運行著的程序就是一個進(jìn)程或者叫做一個任務(wù)矫夯,一個進(jìn)程至少包含一個線程鸽疾,線程就是程序的執(zhí)行流。Mac和iOS中的程序啟動训貌,創(chuàng)建好一個進(jìn)程的同時制肮, 一個線程便開始運行,這個線程叫主線程递沪。主線程在程序中的地位和其他線程不同豺鼻,它是其他線程最終的父線程,且所有界面的顯示操作即AppKit或 UIKit的操作必須在主線程進(jìn)行款慨。
系統(tǒng)中的每一個進(jìn)程都有自己獨立的虛擬內(nèi)存空間儒飒,而同一個進(jìn)程中的多個線程則共用進(jìn)程的內(nèi)存空間。每創(chuàng)建一個新的線程檩奠,都需要一些內(nèi)存(如每個線程有自己的Stack空間)和消耗一定的CPU時間桩了。另外當(dāng)多個線程對同一個資源出現(xiàn)爭奪的時候需要注意線程安全問題。

關(guān)于 RunLoop

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末埠戳,一起剝皮案震驚了整個濱河市井誉,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌整胃,老刑警劉巖颗圣,帶你破解...
    沈念sama閱讀 219,188評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡在岂,警方通過查閱死者的電腦和手機(jī)奔则,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,464評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蔽午,“玉大人易茬,你說我怎么就攤上這事§羲浚” “怎么了疾呻?”我有些...
    開封第一講書人閱讀 165,562評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長写半。 經(jīng)常有香客問我岸蜗,道長,這世上最難降的妖魔是什么叠蝇? 我笑而不...
    開封第一講書人閱讀 58,893評論 1 295
  • 正文 為了忘掉前任璃岳,我火速辦了婚禮,結(jié)果婚禮上悔捶,老公的妹妹穿的比我還像新娘铃慷。我一直安慰自己,他們只是感情好蜕该,可當(dāng)我...
    茶點故事閱讀 67,917評論 6 392
  • 文/花漫 我一把揭開白布犁柜。 她就那樣靜靜地躺著,像睡著了一般堂淡。 火紅的嫁衣襯著肌膚如雪馋缅。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,708評論 1 305
  • 那天绢淀,我揣著相機(jī)與錄音萤悴,去河邊找鬼。 笑死皆的,一個胖子當(dāng)著我的面吹牛覆履,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播费薄,決...
    沈念sama閱讀 40,430評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼硝全,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了楞抡?” 一聲冷哼從身側(cè)響起伟众,我...
    開封第一講書人閱讀 39,342評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎拌倍,沒想到半個月后赂鲤,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,801評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡柱恤,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,976評論 3 337
  • 正文 我和宋清朗相戀三年数初,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片梗顺。...
    茶點故事閱讀 40,115評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡泡孩,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出寺谤,到底是詐尸還是另有隱情仑鸥,我是刑警寧澤,帶...
    沈念sama閱讀 35,804評論 5 346
  • 正文 年R本政府宣布变屁,位于F島的核電站眼俊,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏粟关。R本人自食惡果不足惜疮胖,卻給世界環(huán)境...
    茶點故事閱讀 41,458評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望闷板。 院中可真熱鬧澎灸,春花似錦、人聲如沸遮晚。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,008評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽县遣。三九已至糜颠,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間艺玲,已是汗流浹背括蝠。 一陣腳步聲響...
    開封第一講書人閱讀 33,135評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留饭聚,地道東北人忌警。 一個月前我還...
    沈念sama閱讀 48,365評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像秒梳,于是被迫代替她去往敵國和親法绵。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,055評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 又來到了一個老生常談的問題酪碘,應(yīng)用層軟件開發(fā)的程序員要不要了解和深入學(xué)習(xí)操作系統(tǒng)呢朋譬? 今天就這個問題開始,來談?wù)劜?..
    tangsl閱讀 4,129評論 0 23
  • Object C中創(chuàng)建線程的方法是什么兴垦?如果在主線程中執(zhí)行代碼徙赢,方法是什么字柠?如果想延時執(zhí)行代碼、方法又是什么狡赐? 1...
    AlanGe閱讀 1,740評論 0 17
  • 2016年國慶假期終于把此書過完枕屉,整理筆記和體會于此常柄。 關(guān)于書名 書名源于俄羅斯的演員斯坦尼斯拉夫斯基創(chuàng)作的《演員...
    李劍飛的簡書閱讀 7,246評論 2 65
  • 網(wǎng)上很多資料對多線程都有詳細(xì)的描述與理解,本菜鳥剛剛?cè)腴TJAVA對多線程方面不是很熟悉搀擂,在看過很多視屏西潘,以及相關(guān)博...
    AlbenXie閱讀 430評論 0 0
  • 好懷念啊 那些經(jīng)典電影 畫過一次霸王別姬就停不下來了 這次選擇了重慶森林
    微芒__閱讀 256評論 2 5