小驢拉磨之iOS進階-多線程(1)

11111.jpg

基本概念

做一個表格方便理解相關(guān)的包含關(guān)系

進程 線程 多線程
定義 進程是指在系統(tǒng)中正在運行的一個應(yīng)用程序。每個進程之間是獨立的,每個進程均運行在其專用且受保護的內(nèi)存空間內(nèi) 1個進程要想執(zhí)行任務(wù),必須得有線程(每1個進程至少要有1條線程),1個進程(程序)的所有任務(wù)都在線程中執(zhí)行 1個進程中可以開啟多條線程,每條線程可以并行(同時)執(zhí)行不同的任務(wù)。
我們同時打開迅雷、QQ、系統(tǒng)就會分別啟動2個進程 酷狗播放音樂、使用迅雷下載電影,都需要在線程中執(zhí)行 進程—>車間,線程—>車間工人
WX20171116-101717.png
WX20171116-101906.png

線程的串行(C語言環(huán)境下)

1個線程中的任務(wù)的執(zhí)行是串行的。如果要在一個線程中執(zhí)行多個任務(wù),那么只能一個一個地按順序執(zhí)行這些任務(wù)。也就是說,在同一時間內(nèi),1個線程只能執(zhí)行1個任務(wù),具體串行并行同步異步會在之后的文章中解釋。。。

比如在1個線程中下載3個文件(文件A、文件B、文件C)如果是串行執(zhí)行,因此,可以認為線程是進程中的 1條執(zhí)行路徑

多線程

多線程的原理

  1. 同一時間,CPU只能處理1條線程,只有1條線程在工作(執(zhí)行)
  2. 多線程并發(fā)(同時)執(zhí)行,其實是CPU快速地在多條線程之間調(diào)度(切換)
  3. 如果CPU調(diào)度線程的時間足夠快,就造成了多線程并發(fā)執(zhí)行的假象

多線程優(yōu)缺點

多線程優(yōu)點
  1. 能適當(dāng)提高程序的執(zhí)行效率
  2. 能適當(dāng)提高資源利用率(CPU、內(nèi)存利用率),充分發(fā)揮多核處理器優(yōu)勢,將不同線程任務(wù)分配給不同的處理器,真正進入“并行運算”狀態(tài)
  3. 將耗時、輪詢或者并發(fā)需求高等任務(wù)分配到其他線程執(zhí)行,并由主線程負責(zé)統(tǒng)一更新界面會使得應(yīng)用程序更加流暢,用戶體驗更好
多線程缺點
  1. 創(chuàng)建線程是有開銷的,iOS下主要成本包括:內(nèi)核數(shù)據(jù)結(jié)構(gòu)(大約1KB)、??臻g(子線程512KB、主線程1M、也可以使用-setStackSize:設(shè)置,但必須是4K的倍數(shù),而且最小是16K),創(chuàng)建線程大約需要90ms的創(chuàng)建時間
  2. 如果開啟大量的線程,會降低程序的性能
  3. 線程越多,CPU在調(diào)度線程上的開銷就越大
  4. 程序設(shè)計更加復(fù)雜:比如線程之間的通信、多線程的數(shù)據(jù)共享
多線程使用注意
  1. 共享資源的“爭奪”
  2. 多線程是為了同步完成多項任務(wù),不是為了提高運行效率,而是為了通過提高資源使用效率來提高系統(tǒng)的整體性能
  3. 線程使用不是無節(jié)制的
  4. iOS中的主線程的堆棧大小是1M
  5. 從第二個線程開始都是512KB
  6. 這些數(shù)值不能通過編譯器開關(guān)或線程API函數(shù)更改
  7. 只有主線程有直接修改UI的能力
iOS程序亂使用多線程出現(xiàn)的狀況

在iOS手機端表現(xiàn):手機發(fā)燙、電池消耗迅速

多線程在iOS開發(fā)中的應(yīng)用

做一個表格方便理解,一目了然

主線程 子線程
概念 1個iOS程序運行后,默認會開啟一條線程,稱為“主線程”或“UI線程” 由我們手動創(chuàng)建或者開啟的線程
作用 顯示、刷新UI界面,處理UI事件(比如點擊事件、滾動事件、拖拽事件等) 處理耗時、輪詢或者并發(fā)需求高等的任務(wù)
使用注意 1、別將比較耗時的操作放在主線程中。2、耗時操作會卡住主線程,嚴重影響UI的流暢度,給用戶一種'卡'的壞體驗 盡可能不要刷新UI,可能會崩潰

線程的創(chuàng)建

技術(shù)方案 簡介 語言 線程生命周期 使用頻率
pthread 1. 一套通用的多線程API 2. 適用于Unix\linux\Windows等系統(tǒng)。3. 跨平臺\可移植。4. 適用難度大 C 程序員管理 幾乎不用
NSThread 1. 適用更加面相對象。2. 簡單易用,可直接操作線程對象。 OC 程序員管理 偶爾使用
GCD 1. 旨在替代NSThread等線程技術(shù)。2. 充分利用設(shè)備的多核。 C 自動管理 經(jīng)常使用
NSOperation 1. 基于GCD(底層是GCD)。2. 比GCD多了一些更簡單使用的功能。2. 使用更加面向?qū)ο蟆?/td> OC 自動管理 經(jīng)常使用

蘋果推薦是用GCD 和 NSOperation

注意:

[NSThread currentThread]跟蹤任務(wù)所在線程,適用于NSThread、NSOperation、GCD
使用NSThread的線程,不會自動添加autoreleasepool
線程中的自動釋放池:
@autoreleasepool{}自動釋放池。主線程中是有自動釋放池,使用NSThread 和 NSObject 不會有。如果在后臺線程中創(chuàng)建了autoreleasepool的對象,需要使用自動釋放池,否則會出現(xiàn)內(nèi)存泄漏。當(dāng)自動釋放池銷毀時,對池中的所有對象發(fā)送release消息,清空自動釋放池。當(dāng)所有的autorelease對象,在出了作用域后,會自動添加到最近一次創(chuàng)建的自動釋放池中。

后續(xù)詳細介紹這四種方式

后續(xù)持續(xù)更新~~~~

最后感謝CC老師提供的資料:http://www.itdecent.cn/p/53df4826029e

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 多線程 在iOS開發(fā)中為提高程序的運行效率會將比較耗時的操作放在子線程中執(zhí)行,iOS系統(tǒng)進程默認啟動一個主線程,用...
    郭豪豪閱讀 2,721評論 0 4
  • 本文首發(fā)于我的個人博客:「程序員充電站」[https://itcharge.cn]文章鏈接:「傳送門」[https...
    ITCharge閱讀 350,722評論 308 1,927
  • 一、前言 上一篇文章iOS多線程淺匯-原理篇中整理了一些有關(guān)多線程的基本概念。本篇博文介紹的是iOS中常用的幾個多...
    nuclear閱讀 2,148評論 6 18
  • 離別之后才懂了它——這句話中包含著一份檢討。我們一直偎依它、吮吸它,卻又埋怨它、輕視它、責(zé)斥它。它花了幾千年的目光...
    寶丁閱讀 775評論 0 2
  • 因為經(jīng)常做展覽類的項目嘛,所以會有隱藏鼠標的需求,在unity中比較簡單就可以隱藏,但是如果不是用unity做的話...
    AmazingMei閱讀 1,710評論 0 0

友情鏈接更多精彩內(nèi)容