多线程编程之GCD

2015-04-05  本文已影响57人  阿咿呀嘿

GCD(Grand Central Dispatch)是基于C语言的底层API

使用BLOCK块定义任务作为队列中的操作

操作会被放入FIFO队列

队列负责调度BLOCK块的执行

一、三种队列类型

1、主队列main queue、全局调度队列global dispatch queue(包括四种优先级)、自定义队列

(1)系统主队列-串行执行

dispatch_queue_t queue =dispatch_get_main_queue();

(2)全局调度队列-高优先级、并行执行

dispatch_queue_t hightQueue =dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH,0);

(3)全局调度队列-默认优先级、并行执行

dispatch_queue_t defaultQueue =dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0);

(4)全局调度队列-低优先级、并行执行

dispatch_queue_t lowQueue =dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW,0);

(5)全局调度队列-后台、并行执行

dispatch_queue_t backgroundQueue =dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND,0);

(6)自定义队列-串行执行

dispatch_queue_t serialQueue =dispatch_queue_create("MySerialQueue",DISPATCH_QUEUE_SERIAL);

(7)自定义队列-并行执行

dispatch_queue_t concurrentQueue =dispatch_queue_create("MyConcurrentQueue",DISPATCH_QUEUE_CONCURRENT);

二、串行与并发

1、串行队列serial queue:队列中的BLOCK只能按照添加的顺序FIFO一个执行完再执行下一个

2、并发队列concurrent queue:队列中的BLOCK按照添加的顺序FIFO开始任务,开始后的BLOCK可以同时执行,可能以任意顺序完成BLOCK。

主队列为串行队列,全局调度队列为并发队列,自定义队列可以指定串行或并发。

并发与并行的区别:并发是宏观上同时进行,微观上非同时进行,比如单核CUP上时间片轮流执行;并行是宏观与微观上都同时进行,比如多核CPU上不同的核上同时执行。

三、同步与异步

1、同步Synchronous:同步函数在函数执行结束后才返回

dispatch_sync(backgroundQueue, ^{

NSLog(@"这个BLOCK先执行完成");

});

dispatch_sync(backgroundQueue, ^{

NSLog(@"这个BLOCK后执行完成");

});

2、异步Asynchronous:异步函数在开始执行后立即返回,而不等待函数执行完成

dispatch_async(backgroundQueue, ^{

NSLog(@"这个BLOCK先开始执行,执行完成的顺序不确定");

});

dispatch_async(backgroundQueue, ^{

NSLog(@"这个BLOCK后开始执行,执行完成的顺序不确定");

});

3、延迟Delay:在指定队列上延迟指定时间后开始执行BLOCK

double delayInSeconds =2.0;

dispatch_time_t popTime =dispatch_time(DISPATCH_TIME_NOW, delayInSeconds *NSEC_PER_SEC);

dispatch_after(popTime,dispatch_get_main_queue(), ^{

NSLog(@"在主队列上延迟2秒后开始执行BLOCK");

});

4、一次性Once:指定标识的BLOCK只会被执行一次

static dispatch_once_t onceToken;

dispatch_once(&onceToken, ^{

NSLog(@"不管这个标识为onceToken的BLOCK被提交多少次,只会执行一次");

});

四、分发组:实现多个BLOCK并发执行,全部执行完成后汇总结果

dispatch_group_t group =dispatch_group_create();

dispatch_group_async(group, defaultQueue, ^{

NSLog(@"BLOCK1先开始执行");

});

dispatch_group_async(group, defaultQueue, ^{

NSLog(@"BLOCK2后开始执行");

});

dispatch_group_notify(group, backgroundQueue, ^{

NSLog(@"BLOCK1和BLOCK2全部执行完毕后,才执行这里");

});

附:

苹果官方GCD队列示意图
上一篇 下一篇

猜你喜欢

热点阅读