oc中多線程

關(guān)于多線程,在編程中那是必不可少的,現(xiàn)在我們就好好梳理一下多線程.

在 iOS 中其實(shí)目前主要有3套多線程方案,他們分別是:

NSThread

GCD

NSOperation & NSOperationQueue


NSThread

NSThread是經(jīng)過蘋果封裝后的,并且完全面向?qū)ο蟮摹K阅憧梢灾苯硬倏鼐€程對(duì)象,非常直觀和方便。

它的生命周期還是需要我們手動(dòng)管理,所以并不推薦使用

//多線程處理

-(void)manyThreadHandle

{

//方法1

NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(makerun:) object:@"1"];

// 啟動(dòng)

[thread start];

//方法2? 不用手動(dòng)啟動(dòng) 自動(dòng)啟動(dòng)

[NSThread detachNewThreadWithBlock:^{

NSLog(@"--方法2");

}];

//方法3? 不用手動(dòng)啟動(dòng)自動(dòng)啟動(dòng)

[NSThread detachNewThreadSelector:@selector(makerun:) toTarget:self withObject:@"2"];

}

-(void)makerun:(NSThread*)thred

{

NSLog(@"多線程--%@",thred);

}

2017-08-30 16:01:24.863 runtimeTest[6579:165898] --方法2

2017-08-30 16:01:24.864 runtimeTest[6579:165897] 多線程--1

2017-08-30 16:01:24.864 runtimeTest[6579:165899] 多線程--2

在NSThread 中海油很多方法和屬性

//取消線程

- (void)cancel;

//啟動(dòng)線程

- (void)start;

//判斷某個(gè)線程的狀態(tài)的屬性

@property (readonly, getter=isExecuting) BOOL executing;

@property (readonly, getter=isFinished) BOOL finished;

@property (readonly, getter=isCancelled) BOOL cancelled;

//設(shè)置和獲取線程名字

-(void)setName:(NSString *)n;

-(NSString *)name;

//獲取當(dāng)前線程信息

+ (NSThread *)currentThread;

//獲取主線程信息

+ (NSThread *)mainThread;

//使當(dāng)前線程暫停一段時(shí)間,或者暫停到某個(gè)時(shí)刻

+ (void)sleepForTimeInterval:(NSTimeInterval)time;

+ (void)sleepUntilDate:(NSDate *)date;


GCD 方法

GCD 這個(gè)名字是不是很霸氣 ,天朝人都懂得.其實(shí)指的是Grand Central Dispatch(GCD)

GCD會(huì)自動(dòng)合理地利用更多的CPU內(nèi)核(比如雙核、四核),最重要的是它會(huì)自動(dòng)管理線程的生命周期(創(chuàng)建線程、調(diào)度任務(wù)、銷毀線程),完全不需要我們管理,我們只需要告訴干什么就行。同時(shí)它使用的也是c語言,不過由于使用了 Block(Swift里叫做閉包),使得使用起來更加方便,而且靈活。這個(gè)方法比較實(shí)用簡便,強(qiáng)烈推薦.

在GCD中,加入了兩個(gè)非常重要的概念:任務(wù)隊(duì)列

任務(wù)

任務(wù):即操作,你想要干什么,說白了就是一段代碼,在 GCD 中就是一個(gè) Block,所以添加任務(wù)十分方便。任務(wù)有兩種執(zhí)行方式:同步執(zhí)行異步執(zhí)行,主要區(qū)別在于會(huì)不會(huì)阻塞當(dāng)前線程,直到Block中的任務(wù)執(zhí)行完畢!

同步執(zhí)行:阻塞當(dāng)前線程,不會(huì)開辟新的線程

異步執(zhí)行:不會(huì)阻塞當(dāng)前線,程會(huì)開辟新的線程

隊(duì)列:用于存放任務(wù)。一共有兩種隊(duì)列,串行隊(duì)列并行隊(duì)列

放到串行隊(duì)列的任務(wù),GCD 會(huì)FIFO(先進(jìn)先出)地取出來一個(gè),執(zhí)行一個(gè),然后取下一個(gè),這樣一個(gè)一個(gè)的執(zhí)行。簡單說串行 就是單行車道 ,所有的車(任務(wù))都只能按順序走

放到并行隊(duì)列的任務(wù),GCD 也會(huì)FIFO的取出來,但不同的是,它取出來一個(gè)就會(huì)放到別的線程,然后再取出來一個(gè)又放到另一個(gè)的線程。這樣由于取的動(dòng)作很快,忽略不計(jì),看起來,所有的任務(wù)都是一起執(zhí)行的。簡單說并行 就是多條車道 ,所有的車(任務(wù))都可以在對(duì)應(yīng)車道上走,和隔壁車道沒什么影響

主隊(duì)列? 任何需要刷新 UI 的工作都要在主隊(duì)列執(zhí)行

dispatch_queue_t queue = dispatch_get_main_queue();

自己創(chuàng)建隊(duì)列

//串行隊(duì)列

dispatch_queue_t queue = dispatch_queue_create("tk22.bournes.testQueue", NULL);

dispatch_queue_t queue = dispatch_queue_create("tk22.bournes.testQueue", DISPATCH_QUEUE_SERIAL);

//并行隊(duì)列

dispatch_queue_t queue = dispatch_queue_create("tk22.bournes.testQueue", DISPATCH_QUEUE_CONCURRENT);

//全局并行隊(duì)列

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

隊(duì)列組

隊(duì)列組可以將很多隊(duì)列添加到一個(gè)組里,這樣做的好處是,當(dāng)這個(gè)組里所有的任務(wù)都執(zhí)行完了,隊(duì)列組會(huì)通過一個(gè)方法通知我們。

//1.創(chuàng)建隊(duì)列組

dispatch_group_t group = dispatch_group_create();

//2.創(chuàng)建隊(duì)列

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

//多次使用隊(duì)列組的方法執(zhí)行任務(wù), 只有異步方法

//執(zhí)行3次循環(huán)

dispatch_group_async(group, queue, ^{

for (NSInteger i = 0; i < 3; i++) {

NSLog(@"group-01 - %@", [NSThread currentThread]);

}

});

//主隊(duì)列執(zhí)行8次循環(huán)

dispatch_group_async(group, dispatch_get_main_queue(), ^{

for (NSInteger i = 0; i < 8; i++) {

NSLog(@"group-02 - %@", [NSThread currentThread]);

}

});

//執(zhí)行10次循環(huán)

dispatch_group_async(group, queue, ^{

for (NSInteger i = 0; i < 10; i++) {

NSLog(@"group-03 - %@", [NSThread currentThread]);

}

});

//4.都完成后會(huì)自動(dòng)通知

dispatch_group_notify(group, dispatch_get_main_queue(), ^{

NSLog(@"完成 - %@", [NSThread currentThread]);

});

//運(yùn)行結(jié)果

2017-08-30 16:21:36.201 runtimeTest[6843:174540] group-01 -{number = 3, name = (null)} ? ? ? ? ?2017-08-30 16:21:36.201 runtimeTest[6843:174555] group-03 -{number = 4, name = (null)} ? ? ? ? 2017-08-30 16:21:36.202 runtimeTest[6843:174555] group-03 -{number = 4, name = (null)} ? ? ? ?2017-08-30 16:21:36.202 runtimeTest[6843:174540] group-01 -{number = 3, name = (null)} ? ? ? ? 2017-08-30 16:21:36.202 runtimeTest[6843:174555] group-03 -{number = 4, name = (null)} ? ? ? ?2017-08-30 16:21:36.202 runtimeTest[6843:174540] group-01 -{number = 3, name = (null)} ? ? ? ? 2017-08-30 16:21:36.202 runtimeTest[6843:174555] group-03 -{number = 4, name = (null)} ? ? ? ?2017-08-30 16:21:36.202 runtimeTest[6843:174555] group-03 -{number = 4, name = (null)} ? ? ? ?2017-08-30 16:21:36.202 runtimeTest[6843:174555] group-03 -{number = 4, name = (null)} ? ? ? ?2017-08-30 16:21:36.203 runtimeTest[6843:174555] group-03 -{number = 4, name = (null)} ? ? ? ?2017-08-30 16:21:36.203 runtimeTest[6843:174555] group-03 -{number = 4, name = (null)} ? ? ? ?2017-08-30 16:21:36.203 runtimeTest[6843:174555] group-03 -{number = 4, name = (null)} ? ? ? ?2017-08-30 16:21:36.203 runtimeTest[6843:174555] group-03 -{number = 4, name = (null)} ? ? ? ?2017-08-30 16:21:36.206 runtimeTest[6843:174502] group-02 -{number = 1, name = main} ? ? ? ? 2017-08-30 16:21:36.207 runtimeTest[6843:174502] group-02 -{number = 1, name = main} ? ? ? ? ?2017-08-30 16:21:36.207 runtimeTest[6843:174502] group-02 -{number = 1, name = main} ? ? ? ? ?2017-08-30 16:21:36.207 runtimeTest[6843:174502] group-02 -{number = 1, name = main} ? ? ? ? ?2017-08-30 16:21:36.207 runtimeTest[6843:174502] group-02 -{number = 1, name = main} ? ? ? ? ?2017-08-30 16:21:36.208 runtimeTest[6843:174502] group-02 -{number = 1, name = main} ? ? ? ? 2017-08-30 16:21:36.208 runtimeTest[6843:174502] group-02 -{number = 1, name = main} ? ? ? ? 2017-08-30 16:21:36.208 runtimeTest[6843:174502] group-02 -{number = 1, name = main} ? ? ? ? ?2017-08-30 16:21:36.209 runtimeTest[6843:174502] 完成 -{number = 1, name = main}


NSOperation和NSOperationQueue

NSOperation 是蘋果公司對(duì) GCD 的封裝,完全面向?qū)ο螅允褂闷饋砀美斫?有很多和GCD比較類似

NSOperation 和 NSOperationQueue分別對(duì)應(yīng) GCD 的任務(wù) 和 隊(duì)列

NSOperation只是一個(gè)抽象類,所以不能封裝任務(wù)它有 2 個(gè)子類用于封裝任務(wù)。分別是:NSInvocationOperation和NSBlockOperation

當(dāng)你新創(chuàng)建一個(gè) Operation 后,需要手動(dòng)的調(diào)用start方法來啟動(dòng)任務(wù),它會(huì)默認(rèn)在當(dāng)前隊(duì)列同步執(zhí)行。當(dāng)然你也可以在中途取消一個(gè)任務(wù),只需要調(diào)用其cancel方法即可。


//1.創(chuàng)建NSInvocationOperation對(duì)象

NSInvocationOperation *operation = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(run) object:nil];

//2.開始執(zhí)行

[operation start];

//1.創(chuàng)建NSBlockOperation對(duì)象

NSBlockOperation *operation = [NSBlockOperation blockOperationWithBlock:^{

NSLog(@"%@", [NSThread currentThread]);

}];

//添加多個(gè)Block

for (NSInteger i = 0; i < 5; i++) {

[operation addExecutionBlock:^{

NSLog(@"第%ld次:%@", i, [NSThread currentThread]);

}];

}

//2.開始任務(wù)

[operation start];

2017-08-30 16:33:12.868 runtimeTest[7014:179819]{number = 1, name = main}

2017-08-30 16:33:12.869 runtimeTest[7014:179819] 第3次:{number = 1, name = main}

2017-08-30 16:33:12.869 runtimeTest[7014:179819] 第4次:{number = 1, name = main}

2017-08-30 16:33:12.868 runtimeTest[7014:179888] 第1次:{number = 4, name = (null)}

2017-08-30 16:33:12.868 runtimeTest[7014:179892] 第0次:{number = 3, name = (null)}

2017-08-30 16:33:12.869 runtimeTest[7014:179889] 第2次:{number = 5, name = (null)}

根據(jù)結(jié)果可以知道打印的順序是亂的 這個(gè)也符合我們異步的任務(wù)執(zhí)行情況

//1.創(chuàng)建NSBlockOperation對(duì)象

NSBlockOperation *operation = [NSBlockOperation blockOperationWithBlock:^{

NSLog(@"%@", [NSThread currentThread]);

}];

//2.開始任務(wù)

[operation start];

創(chuàng)建隊(duì)列

//主隊(duì)列

NSOperationQueue *queue = [NSOperationQueue mainQueue];

//1.創(chuàng)建一個(gè)其他隊(duì)列

NSOperationQueue *queue = [[NSOperationQueue alloc] init];

//2.創(chuàng)建NSBlockOperation對(duì)象

NSBlockOperation *operation = [NSBlockOperation blockOperationWithBlock:^{

NSLog(@"%@", [NSThread currentThread]);

}];

//3.添加多個(gè)Block

for (NSInteger i = 0; i < 2; i++) {

[operation addExecutionBlock:^{

NSLog(@"第%ld次:%@", i, [NSThread currentThread]);

}];

}

//4.隊(duì)列添加任務(wù)

[queue addOperation:operation];

2017-08-30 16:35:56.163 runtimeTest[7073:181494]{number = 3, name = (null)}

2017-08-30 16:35:56.163 runtimeTest[7073:181537] 第0次:{number = 4, name = (null)}

2017-08-30 16:35:56.163 runtimeTest[7073:181538] 第1次:{number = 5, name = (null)}

NSOperation有一個(gè)非常實(shí)用的功能,那就是添加依賴 和gcd中的隊(duì)列組管理有點(diǎn)類似.有點(diǎn)啰嗦了,就先介紹這些吧,以后有時(shí)間會(huì)更新.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,546評(píng)論 6 533
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,570評(píng)論 3 418
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,505評(píng)論 0 376
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,017評(píng)論 1 313
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 71,786評(píng)論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,219評(píng)論 1 324
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,287評(píng)論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,438評(píng)論 0 288
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,971評(píng)論 1 335
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 40,796評(píng)論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 42,995評(píng)論 1 369
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,540評(píng)論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,230評(píng)論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,662評(píng)論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,918評(píng)論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 51,697評(píng)論 3 392
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 47,991評(píng)論 2 374

推薦閱讀更多精彩內(nèi)容

  • 一、前言 上一篇文章iOS多線程淺匯-原理篇中整理了一些有關(guān)多線程的基本概念。本篇博文介紹的是iOS中常用的幾個(gè)多...
    nuclear閱讀 2,065評(píng)論 6 18
  • 在這篇文章中,我將為你整理一下 iOS 開發(fā)中幾種多線程方案,以及其使用方法和注意事項(xiàng)。當(dāng)然也會(huì)給出幾種多線程的案...
    張戰(zhàn)威ican閱讀 611評(píng)論 0 0
  • 文章目錄GCD簡介任務(wù)和隊(duì)列GCD的使用步驟隊(duì)列的創(chuàng)建方法任務(wù)的創(chuàng)建方法GCD的基本使用并行隊(duì)列 + 同步執(zhí)行并行...
    lusen_b閱讀 252評(píng)論 0 1
  • 一、前言 本篇博文介紹的是iOS中常用的幾個(gè)多線程技術(shù): NSThread GCD NSOperation 由于a...
    和玨貓閱讀 584評(píng)論 0 1
  • 正常健康的嘴唇一般膚色紅潤而有光澤,干濕適度而有彈性。 2.嘴唇為紅色或深紅色、紫紅色 這是提示你的身體狀態(tài)火比較...
    微微小醫(yī)閱讀 323評(píng)論 0 0