標籤:
一、基本概念1.什麼是進程
進程就是指在系統中正在運行的一個應用程式
每個應用之間是相互獨立的
每個進程都運行在其專有的並且受保護的記憶體空間內。
2.什麼是線程
一個進程想要執行程式,就必須需要一個線程,
線程是程式執行的基本單元,應用的所有的任務都線上程中執行的。
當程式啟動之後,系統會自動為進程建立一條線程,稱之為 “主線程” “UI線程”
3.線程的串列
一個線程執行任務是串列的,也就是說,在一個線程內,執行任務是從順序執行的
同一時間,線程只能執行一個任務----> CPU在同一時間也只能執行一個線程
二、多線程 1.什麼是多線程
多線程指的是,在同一個進程中,建立多個線程,每個線程"並發(同時)“執行各自的任務。
可以有效提高系統的效率
如下,當CPU快速的切換三條線程,就可以產生並發效果
2.多線程的原理
同一時間,CPU只能執行一個線程,只能又一個線程在執行;
當多線程並發的時候,CPU在多個線程之間快速的調度(切換),就能產生並發(同時)執行的現象。
注意: 並發執行,是一種假象,看起來是同時執行的。
並行只是,是真正的同時執行。
3.多線程的優缺點
優點:
能夠提高程式的執行效率
能適當的提高系統資源的利用率
缺點
開啟線程是需要一定的記憶體空間的(預設:主線程 1M 子線程 512B),如果開啟太多線程,會佔用過多的記憶體空間;
線程越多,CPU線上程調度上的消耗增多;
線程越多,相同時間內,每個線程調度是次數就越少;
程式設計更加複雜,例如:線程之間的通訊、線程之間的資料共用等問題;
注意:系統建立的線程稱為"主線程",其他的線程稱為"子線程"。
三、多線程的應用 1.主線程
主線程:當進程開啟的時候,系統預設會開啟 一條線程,稱為:"主線程" 或"UI線程";
作用:
顯示/重新整理UI介面
處理UI介面(例如 點擊、滾動、拖拽等)
2.主線程的注意事項
為了更加良好的使用者體驗,不要講耗時較長的任務放在主線程中,否則會影響UI的流暢度,造成卡頓的現象
例如:
如果耗時較長(10s),那麼主線程是會一直停留在該任務中,直到任務完成,當第5s點擊時候,無法立即響應使用者的點擊事件
將耗時較長的任務放在子線程之後,能夠立即相應使用者的點擊事件
四、IOS多線程的實現方案
五、pthread 和NSThread的簡單介紹
1.pthread的簡單介紹
建立的函數:
int pthread_create(pthread_t * __restrict, const pthread_attr_t * __restrict,void *(*)(void *), void * __restrict);
pthread_t *restrict:線程標識符的地址
const pthread_attr_t *restrict:設定線程的屬性
void *(*)(void *):線程中執行的函數.
void *restrict:傳遞給執行函數的參數. 可以傳一個任意類型的參數
C語言中de void * 等同於 OC中的 id
傳回值: 返回 0 代表線程建立成功
返回其他數值,代表線程建立失敗,.返回的數值,是失敗的狀態
注意:
在ARC的環境下面,C語言和OC不能直接傳遞
__bridge 橋接:C語言沒有自動記憶體管理,需要對C語言代碼進行添加自動記憶體操作,只有在ARC環境下才需要
OC:在 ARC環境下,不需要手動添加自動記憶體管理(retain/release/autorelease/)
添加的目的,就是告訴編譯器,為OC代碼添加自動記憶體管理代碼
對該檔案編譯環境設定:
非ARC機制 -fno-objc-arc
ARC : -fobjc-arc
代碼:
#import "ViewController.h"#import <pthread.h>@interface ViewController ()@end@implementation ViewController- (void)viewDidLoad{ [super viewDidLoad];}- (void)touchesBegan:(NSSet*)touches withEvent:(UIEvent*)event{ // 建立一個線程標識符 pthread_t myThread; NSString* str = @"pthread"; int result = pthread_create(&myThread, NULL, longTimeOperation, str); NSLog(@"%d",result);}void*(longTimeOperation)(void* data){ NSLog(@"----%@------%@", data, [NSThread currentThread]); return NULL;}@end
2.NSThread的介紹 1> 線程的建立和啟動
一個NSThread就代表這一個對象
建立啟動
NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(run) object:nil];
[thread start];
線程一啟動,就是告訴CPU已經"就緒",當CPU調度該線程的時候,就會執行相應的方法。
建立線程後自動啟動線程
[NSThread detachNewThreadSelector:@selector(run) toTarget:self withObject:nil];
隱式建立並啟動線程
[self performSelectorInBackground:@selector(run) withObject:nil];
提示: 後兩種建立的方式,無法獲得該線程對象,就不能對其進行更加詳細的設定
2>常用的方法
主線程相關的:
+ (NSThread *)mainThread; // 獲得主線程
- (BOOL)isMainThread; // 是否為主線程
+ (BOOL)isMainThread; // 是否為主線程
獲得當前線程:
NSThread *current = [NSThread currentThread];
線程的調度優先順序
+ (double)threadPriority;
+ (BOOL)setThreadPriority:(double)p;
- (double)threadPriority;
- (BOOL)setThreadPriority:(double)p;
調度優先順序的取值範圍是0.0 ~ 1.0,預設0.5,值越大,優先順序越高
線程的名字
- (void)setName:(NSString *)n;
- (NSString *)name;
六、線程的狀態
1、線程的狀態
線程一共有四種狀態:就緒、運行、阻塞、死亡。
注意:當線程進入阻塞狀態後,會從可調度線程池裡面移除
2、線程狀態的相關方法
啟動線程(進入就緒狀態)
- (void)start;
阻塞(暫停)線程(進入阻塞狀態)
+ (void)sleepUntilDate:(NSDate *)date;
+ (void)sleepForTimeInterval:(NSTimeInterval)ti;
強制停止線程(進入死亡狀態)
+ (void)exit;
七、線程鎖 1、引入:安全執行緒問題(多個線程訪問同一塊資料)
。。。。。未完待續
IOS開發多線程-多線程技術1