什麼是程序? 程序是指在系統中 正在運作 的一個應用程式 每個程序之間是 獨立 的 , 每個程序均運作在其專用且受保護的記憶體空間内 (說白了就是一塊獨立的記憶體空間)
什麼是線程? 1 個程序要想執行任務, 必須 得有線程( 每 1 個程序至少要有 1 條線程 ) 線程是程序的基本執行單元 ,一個程序(程式)的所有任務都線上程中執行
NSThread的使用:
一個 NSThread 對象就代表一條線程
建立、啟動線程
// 建立線程方式1
- (void)test1
{
// 執行個體化一個線程對像
// target:誰要建立線程
// selector:為那個方法開辟線程
// objec:傳給run方法的參數
NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(run:) object:nil];
// 讓線程開始工作,啟動線程, 在新開的線程執行run方法
[thread start];
}
// 建立線程方式2
- (void)test2
{
[NSThread detachNewThreadSelector:@selector(run:) toTarget:self withObject:@"hello"];
}
// 建立線程方式3
- (void)test3
{
// “隐式”建立線程方式
[self performSelectorInBackground:@selector(run:) withObject:@"cz"];
}
第2種與第3種建立方式的優缺點: 優點:簡單快捷,建立後自動啟動 缺點:無法擷取線程對象,也就無法對線程進行更詳細的設定
主線程相關用法
+ (NSThread *)mainThread; //獲得主線程
- (BOOL)isMainThread; //是否為主線程
+ (BOOL)isMainThread; //是否為主線程
其他用法
獲得目前線程
NSThread*current = [NSThread currentThread];
線程的排程優先級
+ (double)threadPriority;
+ (BOOL)setThreadPriority:(double)p;
- (double)threadPriority;
- (BOOL)setThreadPriority:(double)p;
NSThread *threadA = [[NSThread alloc] initWithTarget:self selector:@selector(run:) object:@"hello"];
threadA.name = @"thraed A";
// 線程優先級
// 是一個浮點數,0.0~1.0。 預設值 0.5
// 開發的時候,一般不去修改優先級的值。
// 優先級,必須調用很多次的時候,才能展現出來。
threadA.threadPriority = 0.1;
// 開始工作
[threadA start];
排程優先級的取值範圍是0.0 ~ 1.0,預設0.5,值越大,優先級越高
線程的 名字
- (void)setName:(NSString *)n;
-( NSString*)name;
線程的狀态
控制線程狀态
啟動線程 // 進入就緒狀态 ->運作狀态。當線程任務執行完畢,自動進入死亡狀态
- (void)start;
阻塞 (暫停)線程 // 進入阻塞狀态
+ (void)sleepUntilDate:(NSDate*)date;
+ (void)sleepForTimeInterval:(NSTimeInterval)ti;
強制停止線程 // 進入死亡狀态
+ (void)exit;
注意:一旦線程停止(死亡)了,就不能再次開啟任務
多線程的安全隐患
1 塊資源可能會被多個線程共享,也就是 多個線程可能會通路同一塊資源 當多個線程通路同一塊資源時,很容易引發 資料錯亂和資料安全 問題 安全隐患解決 – 互斥鎖
互斥鎖使用格式
@synchronized(鎖對象) { // 需要鎖定的代碼 }
開發的時候,一般就使用self就OK
蘋果不推薦我們使用加鎖。因為加鎖,性能太差。
注意:鎖定1份代碼隻用1把鎖,用多把鎖是無效的
互斥鎖的優缺點 優點:能有效防止因多線程搶奪資源造成的資料安全問題 缺點:需要消耗大量的 CPU 資源
互斥鎖的使用前提 : 多條線程搶奪同一塊資源
相關專業術語: 線程同步 線程同步的意思是:多條線程在同一條線上執行(按順序地執行任務) 互斥鎖,就是使用了線程同步技術
線程間通信 什麼叫做線程間通信 在 1 個程序中,線程往往不是孤立存在的,多個線程之間需要經常進行通信
線程間通信的展現 1 個線程傳遞資料給另 1 個線程 在 1 個線程中執行完特定任務後,轉到另 1 個線程繼續執行任務
線程間通信常用方法
//在主線程執行 selector 方法
//(id)arg:傳遞給selector方法的參數
//(BOOL)wait:是否等待selector方法執行結束
- (void)performSelectorOnMainThread:(SEL)aSelector withObject:(id)arg waitUntilDone:(BOOL)wait;
// 在指定線程執行selector方法
- (void)performSelector:(SEL)aSelector onThread:(NSThread *)thr withObject:(id)arg waitUntilDone:(BOOL)wait;