iOS 多線程入門詳解
近期面試複習多線程知識,希望能加深理解。本文從進程、線程基本概念出發,逐步講解串行、併發、多線程原理、主線程職責及耗時操作實戰演示。
1. 什麼是進程?
- 進程是系統中運行的一個應用程式。
- 每個進程獨立存在,運行在自己專用且受保護的記憶體空間中。
- 例如:打開 QQ 和 Xcode,系統會分別啟動兩個進程。
- 可透過「活動監視器」查看 Mac 系統中所有啟動的進程。
2. 什麼是線程?
- 一個進程若要執行任務,必須有線程;一個進程至少有一個線程。
- 線程是進程的基本執行單元,進程的所有任務都在線程中執行。
- 例如:使用酷狗播放音樂、迅雷下載電影都需在線程中運行。
3. 線程的串行執行
- 一個線程中任務是串行(按順序)執行的,同一時間內只能執行一個任務。
- 例如:單線程下載 3 個檔案(A、B、C),必須等 A 完成才能開始 B。
4. 什麼是多線程?
- 一個進程中可開啟多個線程,每個線程可並發(同時)執行不同任務。
- 類比關係:進程 → 車間;線程 → 車間工人。
- 多線程圖解:同時開啟 3 個線程分別下載 3 個檔案(A、B、C),可並行進行。
5. 多線程原理
- 同一時間 CPU 只能執行一個線程,只有單線程在工作(執行)。
- 多線程並發執行,實際上是 CPU 快速在多線程間調度(切換)。
- 若 CPU 調度速度夠快,會產生多線程並發執行的假象。
多線程缺點
- 每個線程佔用一定記憶體(主線程 1MB,子線程 512KB),開啟過多導致記憶體佔用大、效能下降。
- 線程越多,CPU 調度開銷越大(類比工廠工人越多,管理成本越高)。
- 程式設計更複雜:如多線程數據通信、數據共享同步問題。
多線程優點
- 能適當提高程式執行效率。
- 能適當提高資源利用率(CPU、記憶體利用率)。
6. 什麼是主線程?
- iOS 程式啟動後預設開啟一個線程,稱為「主線程」或「UI 線程」。
- 主要作用:顯示/刷新 UI 界面、處理 UI 事件(點擊、滾動、拖拽等)。
- 注意:不要將耗時操作放在主線程,會導致介面卡頓。
7. 耗時操作 Demo 演示
直接在主線程執行(會卡頓)
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
NSLog(@"%s----%@",__func__,[NSThread currentThread]);
// 直接在主線程執行,導致 UI 操作卡頓
[self longTimeOperation];
}
#pragma mark - 耗時操作
-(void)longTimeOperation{
for (int i=0; i<100000; i++) {
NSLog(@"%d",i);
}
}
在子線程執行(不阻塞 UI)
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
NSLog(@"%s----%@",__func__,[NSThread currentThread]);
// 將耗時操作放在子線程執行,不影響 UI 操作
[self performSelectorInBackground:@selector(longTimeOperation) withObject:nil];
}
#pragma mark - 耗時操作
-(void)longTimeOperation{
for (int i=0; i<100000; i++) {
NSLog(@"%d",i);
}
}
以上內容介紹了 iOS 多線程基礎知識,希望對大家有所幫助!