iOS多線程-GCD的幾個常用方法

1.GCD信號量:dispatch_semaphore

(1)dispatch_semaphore_create創(chuàng)建一個Semaphore并初始化信號的總量

(2)dispatch_semaphore_signal:發(fā)送一個信號,讓信號量+1

(3)dispatch_semaphore_waite可使總信號量減1,信號總量小于0時會一直等待(阻塞當(dāng)前線程),否則就可以正常執(zhí)行(\color{red}{注:是先執(zhí)行信號量減1,再判斷當(dāng)前信號量是否小于0})

示例:北京上海兩個窗口售賣火車票

運行結(jié)果如下

北京火車票開始賣票,信號量為1.走在①處信號量減1,然后繼續(xù)往下走,此時如果上海火車站也正在賣票,走在①處信號量減1,此時信號總量小于0,開始等待(阻塞當(dāng)前上海賣票的線程),等到北京賣票完成或者余票為0(北京賣票任務(wù)所在線程執(zhí)行完成)②處,調(diào)用?dispatch_semaphore_signal,則此時信號總量為0,繼續(xù)執(zhí)行上海賣票任務(wù)(上海賣票進程繼續(xù)執(zhí)行),執(zhí)行上海賣票任務(wù)完成后信號量加1②處,調(diào)用?dispatch_semaphore_signal,信號量恢復(fù)為1.

2.GCD隊列組:dispatch_group

(1) 創(chuàng)建隊列組?????dispatch_group_t? * group = dispatch_group_create();

(2) 把任務(wù)放在隊列組? ? ?dispatch_group_async(group,dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0),^{

//任務(wù)一....

});

?dispatch_group_async(group,dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0),^{

//任務(wù)二....});

(3)執(zhí)行完前兩個異步任務(wù)后的兩種操作:

① dispatch_group_notify(group,dispatch_get_main_queue(),^{

//任務(wù)三

});

當(dāng)前兩個異步任務(wù)完成后,把任務(wù)三添加到group中。

② dispatch_group_wait (group,DISPATCH_TIME_FOREVER);

此函數(shù)會阻塞當(dāng)前線程,等前兩個異步任務(wù)完成后才可解除阻塞

3.GCD一次性代碼(只執(zhí)行一次):dispatch_once

/**

* 一次性代碼(只執(zhí)行一次)dispatch_once

*/

- (void)once {

? ? static dispatch_once_t onceToken;

? ? dispatch_once(&onceToken, ^{

? ? ? ? // 只執(zhí)行 1 次的代碼(這里面默認是線程安全的)

? ? });

}

4.GCD延時執(zhí)行方法:dispatch_after

dispatch_after?方法并不是在指定時間之后才開始執(zhí)行處理,而是在指定時間之后將任務(wù)追加到主隊列中。

5.GCD柵欄方法:dispatch_barrier_async??

dispatch_barrier_async 方法會等待前邊追加到并發(fā)隊列中的任務(wù)全部執(zhí)行完畢后,再將指定的任務(wù)追加到該barrier異步隊列中。等該barrier任務(wù)完成后,異步隊列才恢復(fù)為正常執(zhí)行后邊的任務(wù)。

注:dispatch_barrier_async只支持dispatch_queue_create創(chuàng)建的隊列,dispatch_get_global_queue無效。

/**

* 柵欄方法 dispatch_barrier_async

*/

- (void)barrier {

? ? dispatch_queue_t queue = dispatch_queue_create("net.bujige.testQueue", DISPATCH_QUEUE_CONCURRENT);


? ? dispatch_async(queue, ^{

? ? ? ? // 追加任務(wù) 1

? ? ? ? [NSThread sleepForTimeInterval:2];? ? ? ? ? ? ? // 模擬耗時操作

? ? ? ? NSLog(@"1---%@",[NSThread currentThread]);? ? ? // 打印當(dāng)前線程

? ? });

? ? dispatch_async(queue, ^{

? ? ? ? // 追加任務(wù) 2

? ? ? ? [NSThread sleepForTimeInterval:2];? ? ? ? ? ? ? // 模擬耗時操作

? ? ? ? NSLog(@"2---%@",[NSThread currentThread]);? ? ? // 打印當(dāng)前線程

? ? });


? ? dispatch_barrier_async(queue, ^{

? ? ? ? // 追加任務(wù) barrier

? ? ? ? [NSThread sleepForTimeInterval:2];? ? ? ? ? ? ? // 模擬耗時操作

? ? ? ? NSLog(@"barrier---%@",[NSThread currentThread]);// 打印當(dāng)前線程

? ? });


? ? dispatch_async(queue, ^{

? ? ? ? // 追加任務(wù) 3

? ? ? ? [NSThread sleepForTimeInterval:2];? ? ? ? ? ? ? // 模擬耗時操作

? ? ? ? NSLog(@"3---%@",[NSThread currentThread]);? ? ? // 打印當(dāng)前線程

? ? });

? ? dispatch_async(queue, ^{

? ? ? ? // 追加任務(wù) 4

? ? ? ? [NSThread sleepForTimeInterval:2];? ? ? ? ? ? ? // 模擬耗時操作

? ? ? ? NSLog(@"4---%@",[NSThread currentThread]);? ? ? // 打印當(dāng)前線程

? ? });

}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 一.進程&線程 進程:是程序執(zhí)行過程中分配和管理資源的一個基本單位。 線程:是程序執(zhí)行過程中任務(wù)調(diào)度和執(zhí)行的一個基...
    wxhan閱讀 603評論 0 3
  • 前言 本文主要接掃GCD的信號量相關(guān)的內(nèi)容。 代碼的下載地址demo; 1、信號量簡介 此處省略一萬字.........
    ivylee_mr閱讀 420評論 0 0
  • 一、基本介紹 Grand Central Dispatch (GCD)是Apple開發(fā)的一個多核編程的較新的解決方...
    wuyukobe閱讀 462評論 0 1
  • 本文內(nèi)容任務(wù)、隊列的概念、創(chuàng)建方式任務(wù) + 隊列的6種組合的執(zhí)行方式線程間如何通信dispatch_once、di...
    小秀秀耶閱讀 1,074評論 0 9
  • 此時想想覺得蠻好笑,以前的我很害怕畫畫,總覺得好難好難!從心里上就開始抵觸了,就算給我100萬,臣妾還是做不到??!...
    花開的旅途閱讀 346評論 0 1

友情鏈接更多精彩內(nèi)容