iOS多執行緒

2021-09-24 07:10:43 字數 3760 閱讀 4631

1 輕量級執行緒 nsthread

#####什麼是nsthread?

基於執行緒使用 輕量級的多執行緒程式設計方法 乙個nsthread物件代表乙個執行緒 需要手動管理 執行緒的生命週期 處理執行緒同步

// 1 動態建立

nsthread *newthread = [nsthread alloc] initwithtarget:self selector:@slector(threadrun) object:nil];

複製**

// 2 靜態建立

[nsthread detachnewthreadselector:@selector(threadrun) totarget:self withobject:nil];

複製**

// 3 執行緒開啟

[newthread start];

複製**

// 4 執行緒暫停 會阻塞當前的執行緒

[nsthread sleepfortimeinterval:1.0];

[nsthread sleepuntildate:[nsdate datewithtimeintervalsincenow:1.0];

複製**

// 5 執行緒取消 不會停止執行緒 只做 狀態記錄

[newthread cancel];

複製**

// 6 執行緒停止 // 立即終止除了主線程並退出執行緒所有的執行緒並退出 需要在掌握所有執行緒狀態情況呼叫 否則記憶體問題

[nsthread exit];

複製**

// 7 獲取當前執行緒

[nsthread currentthread];

複製**

// 8 獲取主線程

[nsthread mainthread];

複製**

// 9 執行緒優先順序

[newthread setqualityofservice:nsqualityofserviceuserinteractive]

複製**

// nsqualityofserviceuserinteractive:最高優先順序,用於使用者互動事件

nsqualityofserviceuserinitiated:次高優先順序,用於使用者需要馬上執行的事件

nsqualityofservicedefault:預設優先順序,主線程和沒有設定優先順序的執行緒都預設為這個優先順序

nsqualityofserviceutility:普通優先順序,用於普通任務

nsqualityofservicebackground:最低優先順序,用於不重要的任務

執行緒間通訊

// 1 指定當前執行緒執行操作

[self performselector:@selector(threadrun)];

[self performselector:@selector(threadrun) withobject:nil];

[self performselector:@selector(threadrun) withobject:nil afterdelay:1];

複製**

// 2 (在其他執行緒中)指定主線程執行操作 // 更新ui在主線程執行

[self performselectoronmainthread:@selector(threadrun) withobject:nil waituntildone:yes];

複製**

// 3 (在主線程)指定其他執行緒執行操作

// 指定為某個執行緒

[self performselector:@selector(threadrun) onthread:newthread withobject:nil waituntildone:yes];

複製**

// 後台執行緒

[self performselectorinbackground:@selector(threadrun) withobject:nil];

複製**

執行緒同步

// 一段時間只可以某乙個執行緒訪問某個資源

// 執行緒加鎖 nslock @synchronized

處理例子

// 監聽執行緒退出的通知

[[nsnotificationcenter defaultcenter] addobserver:self selector:@selector(threadexitnotifation) name:nsthreadwillexitnotification object:nil

];self.tickedcount = 50;

// 建立執行緒

nsthread *window1 = [[nsthread alloc] initwithtarget:self selector:@selector(saleticket) object:nil];

window1.name = @"beijing";

[window1 start]; // 開始執行緒

nsthread *window2 = [[nsthread alloc] initwithtarget:self selector:@selector(saleticket) object:nil

];window2.name = @"guanzhou";

[window2 start];

// 執行緒執行完推出 持續使用 售票 加迴圈

- (void)saleticket

else }}

}複製**

// 執行緒持續執行和退出 // 使用runloop 一直執行

[[nsnotificationcenter defaultcenter] addobserver:self selector:@selector(threadexitnotifation) name:nsthreadwillexitnotification object:nil

];self.tickedcount = 50;

// 建立執行緒

nsthread *window1 = [[nsthread alloc] initwithtarget:self selector:@selector(thread1) object:nil];

[window1 start]; // 開始執行緒

nsthread *window2 = [[nsthread alloc] initwithtarget:self selector:@selector(thread2) object:nil];

[window2 start];

// 指派任務給執行緒 兩個執行緒執行相同任務

[self performselector:@selector(saleticket) onthread:window1 withobject:nil waituntildone:no];

[self performselector:@selector(saleticket) onthread:window2 withobject:nil waituntildone:no];

//- (void)thread1

//- (void)thread2

- (void)threadexitnotifation

else }}}

複製**

iOS多執行緒

iphone 中的執行緒應用並不是無節制的,官方給出的資料顯示iphone os下的主線程的堆疊大小是1m,第二個執行緒開始都是512kb。並且該值不能通過編譯器開關或執行緒api函式來更改。只有主線程有直接修改ui的能力。一 nsoperation和nsoperationqueue 1 乙個繼承自...

iOS多執行緒

iphone 中的執行緒應用並不是無節制的,官方給出的資料顯示iphone os下的主線程的堆疊大小是1m,第二個執行緒開始都是512kb。並且該值不能通過編譯器開關或執行緒api函式來更改。只有主線程有直接修改ui的能力。一 nsoperation和nsoperationqueue 1 乙個繼承自...

iOS多執行緒

iphone 中的執行緒應用並不是無節制的,官方給出的資料顯示iphone os下的主線程的堆疊大小是1m,第二個執行緒開始都是512kb。並且該值不能通過編譯器開關或執行緒api函式來更改。只有主線程有直接修改ui的能力。一 nsoperation和nsoperationqueue 1 乙個繼承自...