有些程序是一條直線,起點到終點;有些程序是一個圓,不斷循環,直到將它切斷編程
一個運行着的程序就是一個進程或者叫作一個任務,一個進程至少包含一個線程,線程就是程序的執行流。Mac和iOS中的程序啓動,建立好一個進程的同時, 一個線程便開始運行,這個線程叫主線程。主線程在程序中的地位和其餘線程不一樣,它是其餘線程最終的父線程,且全部界面的顯示操做即AppKit或 UIKit的操做必須在主線程進行。
系統中的每個進程都有本身獨立的虛擬內存空間,而同一個進程中的多個線程則共用進程的內存空間。每建立一個新的線程,都須要一些內存(如每一個線程有本身的Stack空間)和消耗必定的CPU時間。另外當多個線程對同一個資源出現爭奪的時候須要注意線程安全問題
多線程的實現原理:雖然在同一時刻,CPU只能處理1條線程,可是CPU能夠快速地在多條線程之間調度(切換),形成了多線程併發執行的假象。安全
能適當提升程序的執行效率。
能適當提升資源利用率(CPU、內存利用率)。bash
建立線程是須要成本的:iOS下主要成本包括:在棧空間的子線程512KB、主線程1MB,建立線程大約須要90毫秒的建立時間。
線程越多,CPU在調度線程上的開銷就越大。
線程越多,程序設計就越複雜:由於要考慮到線程之間的通訊,多線程的數據共享。服務器
計算機操做系統都有的基本概念,如下概念簡單方式來描述。網絡
注意:多線程
- 一個進程可有多個線程。
- 一個進程可有多個隊列。
- 隊列可分併發隊列和串行隊列。
一個iOS程序運行後,默認會開啓1條線程,稱爲「主線程」或「UI線程」併發
主線程的使用注意事項:
不能把比較耗時的操做放到主線程中,,嚴重影響UI的流暢度,給用戶一種程序「卡頓」的體驗。
所以,要將耗時的操做放在子線程中異步執行。這樣一來,及時開始執行了耗時的操做,也不會影響主線程中UI交互的體驗。app
子線程是異步執行的,不影響主線程。在iOS開發中,咱們須要將耗時的任務(網絡請求,複雜的運算)放在子線程進行,不讓其影響UI的交互體驗。iphone
當多個線程訪問同一塊資源時,很容易引起數據錯亂和數據安全問題。就比如好幾我的在同時修改同一個表格,形成數據的錯亂。異步
咱們須要給數據添加互斥鎖。也就是說,當某線程訪問一個數據以前就要給數據加鎖,讓其不被其餘的線程所修改。就比如一我的修改表格的時候給表格設置了密碼,那麼其餘人就沒法訪問文件了。當他修改文件以後,再講密碼撤銷,第二我的就能夠訪問該文件了。
注意:
這裏的線程都爲子線程,若是給數據加了鎖,就等於將這些異步的子線程變成同步的了,這也叫作線程同步技術。
@synchronized(鎖對象) { // 須要鎖定的代碼 };
複製代碼
優勢:能有效防止因多線程搶奪資源形成的數據安全問題
缺點:須要消耗大量的CPU資源
互斥鎖的使用前提:多條線程搶奪同一塊資源的時候使用。
OC在定義屬性時有nonatomic和atomic兩種選擇
atomic:原子屬性,爲setter方法加鎖(默認就是atomic)
nonatomic:非原子屬性,不會爲setter方法加鎖
atomic:線程安全,須要消耗大量的資源
nonatomic:非線程安全,適合內存小的移動設備
建議:
全部屬性都聲明爲nonatomic,儘可能避免多線程搶奪同一塊資源,將加鎖、資源搶奪的業務邏輯交給服務器端處理,減少移動客戶端的壓力。
每一個NSThread對象對應一個線程,真正最原始的線程。
1)優勢:NSThread 輕量級最低,相對簡單。
2)缺點:手動管理全部的線程活動,如生命週期、線程同步、睡眠等。
自帶線程管理的抽象類。
1)優勢:自帶線程週期管理,操做上可更注重本身邏輯。
2)缺點:面向對象的抽象類,只能實現它或者使用它定義好的兩個子類:NSInvocationOperation 和 NSBlockOperation。
Grand Central Dispatch (GCD)是Apple開發的一個多核編程的解決方法。
1)優勢:最高效,避開併發陷阱。
2)缺點:基於C實現。
1)簡單而安全的選擇NSOperation實現多線程便可。
2)處理大量併發數據,又追求性能效率的選擇GCD。
3)NSThread本人選擇基本上是在作些小測試上使用,固然也能夠基於此造個輪子。
圖片異步加載。這種常見的場景是最多見也是必不可少的。異步加載圖片有分紅兩種來講明一下。
第一種,在UI主線程開啓新線程按順序加載圖片,加載完成刷新UI。
第二種,依然是在主線程開啓新線程,順序不定地加載圖片,加載完成個字刷新UI。
創做工具上的異步。 這個跟上邊任務調度道理差很少,只是爲了豐富描述,有助於「觸類旁通」效果。以下描述的是app創做小說。
場景一,app本地創做10個章節內容未成同步服務器,接着同時發表這10個章節將產生的一系列動做,其中上傳內容,獲取分配章節Id,若是後臺沒有作處理最好方式作異步按順序執行。
場景二,app本地創做列表中有3本小說要發表,若是同時發表創做列表中的3本小說,天然考慮並行隊列執行發表。
聲明:本文非原創,僅僅整理一些開發技能知識文章,以做存檔學習用
參考
www.jianshu.com/p/6e6f4e005…
www.jianshu.com/p/f28a50f72…
www.jianshu.com/p/6e74f5438…
juejin.im/post/57cb8e…
mobile.51cto.com/iphone-4034…
做爲一個開發者,有一個學習的氛圍和一個交流圈子特別重要,這是個人交流羣761407670(111),你們有興趣能夠進羣裏一塊兒交流學習