知識(shí)點(diǎn)
1.理解線(xiàn)程的概念
2.NSThread的使用
3.NSOperation的使用
4.GCD的使用
5.線(xiàn)程鎖,線(xiàn)程安全
===============================
1.多線(xiàn)程是一種實(shí)現(xiàn)多任務(wù)并發(fā)執(zhí)行的技術(shù),允許同時(shí)執(zhí)行多個(gè)任務(wù),能夠更合理的利用CPU的資源,提高效率、防止用戶(hù)界面卡頓。
在iOS中,所有的UI處理只能在主線(xiàn)程做。
什么是進(jìn)程?
· 簡(jiǎn)單的說(shuō)進(jìn)程就是我們電腦上運(yùn)行的一個(gè)個(gè)應(yīng)用程序,每一個(gè)程序就是一個(gè)進(jìn)程,并且每個(gè)進(jìn)程之間是獨(dú)立的,每個(gè)進(jìn)程運(yùn)行在其專(zhuān)用受保護(hù)的內(nèi)存空間內(nèi)(window系統(tǒng)可以通過(guò)任務(wù)管理器進(jìn)行查看,Mac系統(tǒng)中可以通過(guò)活動(dòng)監(jiān)視器對(duì)其進(jìn)行查看)
什么是線(xiàn)程?
· 通過(guò)上面的介紹我們知道了什么是進(jìn)程,那么如何讓進(jìn)程運(yùn)行起來(lái),這個(gè)時(shí)候就要有線(xiàn)程了,也就是說(shuō)每個(gè)應(yīng)用程序想要跑起來(lái),最少也要有一條線(xiàn)程存在,其實(shí)應(yīng)用程序啟動(dòng)的時(shí)候我們的系統(tǒng)就會(huì)默認(rèn)幫我們的應(yīng)用程序開(kāi)啟一條線(xiàn)程,這條線(xiàn)程也叫做'主線(xiàn)程',或者'UI線(xiàn)程'
進(jìn)程和線(xiàn)程之間的關(guān)系
· 線(xiàn)程是進(jìn)行的執(zhí)行單元,進(jìn)程的所有任務(wù)都在線(xiàn)程中執(zhí)行,舉例來(lái)說(shuō):進(jìn)程就好比公司中的一個(gè)個(gè)部門(mén),線(xiàn)程則代表著部門(mén)中的同事,而主線(xiàn)程當(dāng)然是我們的老板了,一個(gè)公司部能沒(méi)有老板,一個(gè)程序不能沒(méi)有線(xiàn)程其實(shí)都是一個(gè)道理.
什么是CPU?
· CPU(中央處理器,Central Processing Unit)是一塊超大規(guī)模的集成電路,只要用來(lái)解釋計(jì)算機(jī)指令以及處理計(jì)算機(jī)軟件中的數(shù)據(jù).
多線(xiàn)程的原理
· 同一時(shí)間,CPU值能處理一個(gè)線(xiàn)程,只有一條線(xiàn)程在執(zhí)行,多線(xiàn)程指的就是多條線(xiàn)程同時(shí)執(zhí)行,其實(shí)就是CPU快速的在多條線(xiàn)程之間的切換,如果CPU調(diào)度線(xiàn)程的時(shí)間足夠快,那么就會(huì)造成多線(xiàn)程并發(fā)執(zhí)行的假象,而當(dāng)線(xiàn)程特別多的時(shí)候,那么CPU在多條切換的效率也就會(huì)下降,同時(shí)消耗大量的CPU資源,線(xiàn)程的執(zhí)行效率也就會(huì)下降.
多線(xiàn)程優(yōu)點(diǎn)
· 能適當(dāng)提高程序的執(zhí)行效率
· 能適當(dāng)提高資源的利用率
多線(xiàn)程的缺點(diǎn)
· 開(kāi)啟線(xiàn)程需要占用一定的內(nèi)存空間,如果開(kāi)啟大量的線(xiàn)程,則會(huì)占用大量的內(nèi)存空間,降低程序的性能
· 線(xiàn)程越多,CPU在調(diào)度線(xiàn)程上得開(kāi)銷(xiāo)就越大,程序的設(shè)計(jì)上也就更加的復(fù)雜,因此不推薦開(kāi)啟太多的線(xiàn)程,一般開(kāi)啟2~5條為最佳(且用且珍惜);
主線(xiàn)程
· 也就是應(yīng)用程序啟動(dòng)的時(shí)候,系統(tǒng)默認(rèn)幫我們創(chuàng)建的線(xiàn)程,稱(chēng)之為'主線(xiàn)程'或者是'UI線(xiàn)程';
· 主線(xiàn)程的作用一般都是用來(lái)顯示或者刷新UI界面例如:點(diǎn)擊,滾動(dòng),拖拽等事件
IOS中多線(xiàn)程的實(shí)現(xiàn)方案
方案
簡(jiǎn)介
語(yǔ)言
線(xiàn)程生命周期
使用頻率
pthread
· 一套通用的多線(xiàn)程API
· 適用于 Unix / Linux / Windows
· 跨平臺(tái)\可移植
· 使用難度大
C
程序員管理
幾乎不用
NSThread
· 使用更加面向?qū)ο?br>
· 簡(jiǎn)單易用,可直接操作線(xiàn)程對(duì)象
OC
程序員管理
偶爾使用
GCD
· 旨在替代NSThread等線(xiàn)程技術(shù)
· 充分利用設(shè)備的多核
C
自動(dòng)管理
經(jīng)常使用
NSOperation
· 基于GCD(底層是GCD)
· 比GCD多了一些更簡(jiǎn)單實(shí)用的功能
· 使用更加面向?qū)ο?br>
OC
自動(dòng)管理
經(jīng)常使用
===============================
2.NSThread線(xiàn)程控制
1).創(chuàng)建線(xiàn)程,并自動(dòng)執(zhí)行
[NSThread detachNewThreadSelector:@selector(doSomeThing) toTarget:self withObject:nil];
2).創(chuàng)建線(xiàn)程,不自動(dòng)執(zhí)行
[[NSThread alloc] initWithTarget:self selector:@selector(doSomeThing) object:nil];
3).設(shè)置線(xiàn)程名
thread.name = @"另一個(gè)線(xiàn)程";
4).執(zhí)行線(xiàn)程
[thread start];
5).線(xiàn)程取消
[thread cancel];
6).函數(shù)內(nèi)獲取當(dāng)前線(xiàn)程
[NSThread currentThread];
7).獲取主線(xiàn)程
[NSThread mainThread];
7).線(xiàn)程休眠
[NSThread sleepForTimeInterval:1.0f]; // 休眠幾秒
[NSThread sleepUntilDate:date]; // 休眠到指定時(shí)間
8).線(xiàn)程退出
[NSThread exit];
9).線(xiàn)程通信
[self performSelector:@selector(function) onThread:[NSThread mainThread] withObject:nil waitUntilDone:YES];
===============================
3.NSOperation,是以任務(wù)為中心的一種多線(xiàn)程技術(shù),并不直接管理線(xiàn)程
1).NSOperation是抽象父類(lèi),不要直接使用,而應(yīng)該使用它的子類(lèi)
NSInvocationOperation
[[NSInvocationOperation alloc] initWithTarget:self selector:@selector(doSomeThing) object:nil];
NSBlockOperation
[NSBlockOperation blockOperationWithBlock:^{}];
添加任務(wù)間的依賴(lài)關(guān)系,前者依賴(lài)于后者的完成,也就是后者執(zhí)行完,前者才能執(zhí)行,依賴(lài)關(guān)系需要放在添加到隊(duì)列之前設(shè)置
[invocation addDependency:blockOperation];
如果有必要,可以讓Operation取消
[invocation cancel];
2.NSOperationQueue,任務(wù)隊(duì)列,NSOperation對(duì)象需要添加到隊(duì)列里面才會(huì)執(zhí)行
添加到隊(duì)列里之后,自動(dòng)會(huì)給每個(gè)NSOperation對(duì)象創(chuàng)建一個(gè)線(xiàn)程去執(zhí)行
創(chuàng)建NSOperationQueue
[[NSOperationQueue alloc] init];
設(shè)置最大并發(fā)數(shù)
queue.maxConcurrentOperationCount = 1;
添加任務(wù)到隊(duì)列里
[queue addOperation:blockOperation];
讓隊(duì)列里面,所有的Operation都取消
[queue cancelAllOperations];
獲取當(dāng)前線(xiàn)程對(duì)列
currentQueue
獲取主線(xiàn)程對(duì)列
mainQueue
===============================
4.GCD是一套C語(yǔ)言的線(xiàn)程控制API,是NSOperation的底層實(shí)現(xiàn),用Block來(lái)表示一個(gè)任務(wù)
1).創(chuàng)建隊(duì)列
dispatch_queue_create("QF Queue", DISPATCH_QUEUE_CONCURRENT);
2).系統(tǒng)的隊(duì)列
dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); // 全局隊(duì)列
dispatch_get_main_queue(); // 主線(xiàn)程隊(duì)列
3).異步執(zhí)行任務(wù)
dispatch_async(globalQuque, ^{});
4).創(chuàng)建分組
dispatch_group_create();
5).添加任務(wù)到分組,并執(zhí)行
dispatch_group_async(group, globalQuque, ^{});
6).分組執(zhí)行完的通知
dispatch_group_notify(group, mainQuque, ^{});
===============================
5.線(xiàn)程鎖
1).方式1:
_lock = [[NSLock alloc] init];
[_lock tryLock];
[_lock unlock];
2).方式2:
@synchronized(self) {}