[iOS 多線程] iOS多線程-概念

iOS多線程-概念

multithread.png

線程概述

有些程序是一條直線,起點到終點;有些程序是一個圓,不斷循環,直到將它切斷編程

一個運行着的程序就是一個進程或者叫作一個任務,一個進程至少包含一個線程,線程就是程序的執行流。Mac和iOS中的程序啓動,建立好一個進程的同時, 一個線程便開始運行,這個線程叫主線程。主線程在程序中的地位和其餘線程不一樣,它是其餘線程最終的父線程,且全部界面的顯示操做即AppKit或 UIKit的操做必須在主線程進行。
系統中的每個進程都有本身獨立的虛擬內存空間,而同一個進程中的多個線程則共用進程的內存空間。每建立一個新的線程,都須要一些內存(如每一個線程有本身的Stack空間)和消耗必定的CPU時間。另外當多個線程對同一個資源出現爭奪的時候須要注意線程安全問題
多線程的實現原理:雖然在同一時刻,CPU只能處理1條線程,可是CPU能夠快速地在多條線程之間調度(切換),形成了多線程併發執行的假象。安全

多線程的優勢

能適當提升程序的執行效率。
能適當提升資源利用率(CPU、內存利用率)。bash

多線程的缺點

建立線程是須要成本的:iOS下主要成本包括:在棧空間的子線程512KB、主線程1MB,建立線程大約須要90毫秒的建立時間。
線程越多,CPU在調度線程上的開銷就越大。
線程越多,程序設計就越複雜:由於要考慮到線程之間的通訊,多線程的數據共享。服務器

計算機操做系統都有的基本概念,如下概念簡單方式來描述。網絡

  • 進程: 一個具備必定獨立功能的程序關於某個數據集合的一次運行活動。能夠理解成一個運行中的應用程序。
  • 線程: 程序執行流的最小單元,線程是進程中的一個實體。
  • 同步: 只能在當前線程按前後順序依次執行,不開啓新線程。
  • 異步: 能夠在當前線程開啓多個新線程執行,可不按順序執行。
  • 隊列(Dispatch Queue): 裝載線程任務的隊形結構。
  • 並行隊列(Concurrent Dispatch Queue): 線程執行能夠同時一塊兒進行執行,不須要上一個執行完,就能執行下一個的。
  • 串行隊列(Serial Dispatch Queue): 線程執行只能依次逐一前後有序的執行,等待上一個執行完,再執行下一個。

注意:多線程

  • 一個進程可有多個線程。
  • 一個進程可有多個隊列。
  • 隊列可分併發隊列和串行隊列。

iOS開發中的多線程

iOS的主線程

一個iOS程序運行後,默認會開啓1條線程,稱爲「主線程」或「UI線程」併發

主線程的做用:

  • 顯示\刷新UI界面
  • 處理UI事件(好比點擊事件、滾動事件、拖拽事件等)

主線程的使用注意事項:
不能把比較耗時的操做放到主線程中,,嚴重影響UI的流暢度,給用戶一種程序「卡頓」的體驗。
所以,要將耗時的操做放在子線程中異步執行。這樣一來,及時開始執行了耗時的操做,也不會影響主線程中UI交互的體驗。app

iOS的子線程

子線程是異步執行的,不影響主線程。在iOS開發中,咱們須要將耗時的任務(網絡請求,複雜的運算)放在子線程進行,不讓其影響UI的交互體驗。iphone

多線程安全

當多個線程訪問同一塊資源時,很容易引起數據錯亂和數據安全問題。就比如好幾我的在同時修改同一個表格,形成數據的錯亂。異步

資源搶奪的解決方案

咱們須要給數據添加互斥鎖。也就是說,當某線程訪問一個數據以前就要給數據加鎖,讓其不被其餘的線程所修改。就比如一我的修改表格的時候給表格設置了密碼,那麼其餘人就沒法訪問文件了。當他修改文件以後,再講密碼撤銷,第二我的就能夠訪問該文件了。

注意:
這裏的線程都爲子線程,若是給數據加了鎖,就等於將這些異步的子線程變成同步的了,這也叫作線程同步技術。

互斥鎖使用:

@synchronized(鎖對象) { // 須要鎖定的代碼  };
複製代碼

互斥鎖的優缺點

優勢:能有效防止因多線程搶奪資源形成的數據安全問題
缺點:須要消耗大量的CPU資源

互斥鎖的使用前提:多條線程搶奪同一塊資源的時候使用。

互斥鎖在iOS開發中的使用

OC在定義屬性時有nonatomic和atomic兩種選擇

atomic:原子屬性,爲setter方法加鎖(默認就是atomic)
nonatomic:非原子屬性,不會爲setter方法加鎖

nonatomic和atomic對比

atomic:線程安全,須要消耗大量的資源
nonatomic:非線程安全,適合內存小的移動設備

建議:
全部屬性都聲明爲nonatomic,儘可能避免多線程搶奪同一塊資源,將加鎖、資源搶奪的業務邏輯交給服務器端處理,減少移動客戶端的壓力。

iOS多線程技術對比

1434508-f1aa16721184750a.png

NSThread

每一個NSThread對象對應一個線程,真正最原始的線程。
1)優勢:NSThread 輕量級最低,相對簡單。
2)缺點:手動管理全部的線程活動,如生命週期、線程同步、睡眠等。

NSOperation

自帶線程管理的抽象類。
1)優勢:自帶線程週期管理,操做上可更注重本身邏輯。
2)缺點:面向對象的抽象類,只能實現它或者使用它定義好的兩個子類:NSInvocationOperation 和 NSBlockOperation。

GCD

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),你們有興趣能夠進羣裏一塊兒交流學習

相關文章
相關標籤/搜索