4.0 多線程基礎,4.0多線程
4.0-1.1 進程
- 概念 : 進程是指在系統中正在啟動並執行一個應用程式 (作業系統中每一個 APP 就是一個進程)
- 性質 : 每個進程之間是獨立的,每個進程均運行在其專用且受保護的記憶體空間內
進程為應用程式開闢獨立的記憶體空間;(這塊記憶體空間是獨立的,受保護的!進程和進程之間是互不干擾的!)
- 舉例 : 比如同時開啟QQ、Xcode,系統就會分別啟動2個進程
- 查看進程 : 通過“活動監視器”可以查看Mac系統中所開啟的進程
- 所有的 UI 操作和 UI 事件都是進程
4.0-1.2 線程
- 1個進程要想執行任務,必須得有線程(每1個進程至少要有1條線程)
- 線程是進程的基本執行單元,一個進程(程式)的所有任務都線上程中執行( 線程執行進程/應用程式中的代碼)
|
| 舉例 : 比如使用酷狗播放音樂、使用迅雷下載電影,都需要線上程中執行 |
- 主線程:在一個應用程式啟動之後,會預設開啟一條線程
- 子線程:主線程之外的線程(手動開啟的)
|
單個線程 - 串列:
| 概念 : 1個線程中任務的執行是串列的(線上程中的代碼是按順序執行的!同一時間內,只能有一個代碼塊執行!) |
| 解析 : 如果要在1個線程中執行多個任務,那麼只能一個一個地按順序執行這些任務 也就是說,在同一時間內,1個線程只能執行1個任務 |
| 舉例 : 比如在1個線程中下載3個檔案(分別是檔案A、檔案B、檔案C), 只能一個一個的下載 |
| 總結 : 因此,也可以認為線程是進程中的1條執行路徑 |
| 問題:為什麼開啟一條新線程之後就能解決卡住主線程這個問題了呢?答: 因為線程和線程之間是並發執行(同時執行)! |
多個線程 - 並行:多線程
| 概念 : 1個進程中可以開啟多條線程,每條線程可以並行(同時)執行不同的任務 |
| 優點 : 多線程技術可以提高程式的執行效率 |
| 舉例 : 比如同時開啟3條線程分別下載3個檔案(分別是檔案A、檔案B、檔案C), 則分別同時下載 |
4.0-1.3 【區別】進程 & 線程 進程是由許多條線程組成,一個進程可以包含很多條線程,每條線程都可以執行不同的代碼!進程與線程的區別:
| (1)調度:線程作為調度和分配的基本單位,進程作為擁有資源的基本單位 |
| (2)並發性:不僅進程之間可以並發執行,同一個進程的多個線程之間也可並發執行 |
| (3)擁有資源:進程是擁有資源的一個獨立單位,線程不擁有系統資源,但可以訪問隸屬於進程的資源. |
| (4)系統開銷:在建立或撤消進程時,由於系統都要為之分配和回收資源,導致系統的開銷明顯大於建立或撤消線程時的開銷。 |
4.0-2.1 多線程原理多線程原理:(為什麼多條線程之間可以並發(同時)執行呢?)
| 本質 : 同一時間,CPU只能處理1條線程,只有1條線程在工作(執行) 多線程並發(同時)執行,其實是CPU快速地在多條線程之間調度(切換) |
| 原理 : 如果CPU調度線程的時間足夠快,就造成了多線程並發執行的假象 |
| 思考:如果線程非常非常多,會發生什麼情況? 答案 :如果線程非常多,會在多條線程之間來回切換,消耗大量的 CPU 資源
CPU會在N多線程之間調度,CPU會累死,消耗大量的CPU資源每條線程被調度執行的頻次會降低(線程的執行效率降低) |
iOS 8.0 主線程的預設堆棧大小也是 512K |
4.0-2.2 多線程優缺點多線程的優點 :
(1) 能適當提高程式的執行效率:
- 並發執行(同時執行): 線程和線程之間是同時執行的!(不同的線程中,任務同時執行)
|
| (2) 能適當提高資源使用率(CPU、記憶體利用率) |
多線程的缺點 : (既然多線程這麼爽, 線程是不是越多越好呢?)
| (1) 開啟線程需要佔用一定的記憶體空間(預設情況下,主線程佔用1M,子線程佔用512KB的棧區空間),如果開啟大量的線程,會佔用大量的記憶體空間,降低程式的效能 |
| (2) 線程開啟越多,CPU 就需要在多條線程之間來回切換,CPU在調度線程上的開銷就越大,CPU就越累! |
| (3) 開啟線程會提高代碼的複雜性(會使應用程式增加很多代碼!代碼變多之後,程式複雜性就會提高!)程式設計更加複雜:比如線程之間的通訊、多線程的資料共用 |
建議: 在行動裝置 App的開發中; 一般只開3~5條線程!
4.0-2.3 多線程在iOS開發中的應用 主線程 / UI線程:
| 概念 : 一個iOS程式運行後,預設會開啟1條線程,稱為“主線程”或“UI線程” (程式啟動建立的線程) |
作用 :
- 顯示 / 重新整理UI介面
- 處理UI事件(比如點擊事件、滾動事件、拖拽事件等)
|
使用注意 :
- 別將比較耗時的操作放到主線程中
- 要將耗時操作放在後台線程執行,否則會影響 UI 的流暢度,給使用者一種'卡頓'的壞體驗,破壞使用者體驗
- 所有網路訪問都是耗時操作!
|
解決方案 :
- 將耗時操作放在子線程(後台線程、非主線程)
- 那樣就不會阻塞我們的主線程 , 一般開 3 ~ 6 條線程
好處 :
- 在使用者點擊按鈕那一刻就有反應
- 能同時處理耗時操作和用UI控制項的事件
|
4.0-2.4 iOS中多線程的實現方案
如果你覺得本篇文章對你有所協助,請點擊右下部“推薦”,^_^
作者:藍田(Loto)
出處:http://www.cnblogs.com/shorfng/
本文著作權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文串連。
如有疑問,請發送郵件至 shorfng@126.com 聯絡我。