iOS多線程知識(shí)(一)-基礎(chǔ)知識(shí)
上篇中說(shuō)到了多線程創(chuàng)建的四種方法,在iOS中使用較多的是后面三種方法。本篇將介紹iOS多線程中NSThread的使用
一.創(chuàng)建和啟動(dòng)線程
1.NSthread有三種創(chuàng)建新線程的方法:
//方法1:
NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(run) object:nil];‘
thread.name =@"線程1";
//開(kāi)啟線程
[thread start];
//方法2:創(chuàng)建線程對(duì)象, 自動(dòng)開(kāi)啟
[NSThread detachNewThreadSelector:@selector(run) toTarget:self withObject:nil];
//方法3:隱式的創(chuàng)建分線程
[self performSelectorInBackground:@selector(run) withObject:nil];
上述后兩種創(chuàng)建線程方式的優(yōu)缺點(diǎn)
- 優(yōu)點(diǎn):簡(jiǎn)單快捷
- 缺點(diǎn):無(wú)法對(duì)線程進(jìn)行更詳細(xì)的設(shè)置
當(dāng)線程綁定的方法執(zhí)行完畢之后,線程對(duì)象就會(huì)被銷(xiāo)毀。線程一旦被銷(xiāo)毀,就不能再次重新開(kāi)啟。如果想再次執(zhí)行run方法,必須重新創(chuàng)建新的線程對(duì)象
2.主線程的相關(guān)用法
// 返回主線程
+ (NSThread *)mainThread;
// 是否為主線程(類(lèi)方法)
+ (BOOL)isMainThread;
// 是否為主線程(對(duì)象方法)
- (BOOL)isMainThread;
3.其他用法
//獲得當(dāng)前線程
NSThread *current = [NSThread currentThread];
//線程的調(diào)度優(yōu)先級(jí)
+ (double)threadPriority;
+ (BOOL)setThreadPriority:(double)p;
- (double)threadPriority;
- (BOOL)setThreadPriority:(double)p;
調(diào)度優(yōu)先級(jí)的取值范圍是0.0 ~ 1.0,默認(rèn)0.5,值越大,優(yōu)先級(jí)越高
二.多線程的安全隱患
在多線程中,一塊資源可能被多個(gè)線程共享,也就是多個(gè)線程可能會(huì)訪問(wèn)同一塊資源。此時(shí)很容易引發(fā)數(shù)據(jù)錯(cuò)亂和數(shù)據(jù)安全問(wèn)題
舉例說(shuō)明:
針對(duì)以上情況,需要使用互斥鎖來(lái)限制
互斥鎖使用格式
@synchronized(
鎖對(duì)象) {需要鎖定的代碼}
互斥鎖的優(yōu)點(diǎn)和缺點(diǎn):
- 優(yōu)點(diǎn):能有效防止由多線程搶奪資源造成的數(shù)據(jù)安全問(wèn)題
- 缺點(diǎn):需要消耗大量的CPU資源
互斥鎖的作用其實(shí)就是使多條線程在同一條線上按照順序去執(zhí)行,實(shí)現(xiàn)線程同步
三.線程間通信
在一個(gè)進(jìn)程中,線程往往不是孤立存在的,多個(gè)線程之間經(jīng)常要進(jìn)行通信
- 一個(gè)線程傳遞數(shù)據(jù)給另一個(gè)線程
- 在一個(gè)線程執(zhí)行完特定任務(wù)后,轉(zhuǎn)到另一個(gè)線程繼續(xù)執(zhí)行任務(wù)
例如:在子線程中下載完圖片之后,此時(shí)需要切換到主線程中刷新UI展示圖片

線程任務(wù)切換
線程間通信常用方法:
切換到主線程上執(zhí)行相關(guān)任務(wù)
- (void)performSelectorOnMainThread:(SEL)aSelector withObject:(id)arg waitUntilDone:(BOOL)wait;
切換到指定線程中執(zhí)行相關(guān)任務(wù)
- (void)performSelector:(SEL)aSelector onThread:(NSThread *)thr withObject:(id)arg waitUntilDone:(BOOL)wait;