您的位置:首页 > 移动开发 > IOS开发

iOS多线程——GCD

2015-08-20 11:58 501 查看
[iOS多线程——GCD]

GCD —— Grand Central Dispatch

(1).是基于C语言的底层API

(2).用Block定义任务,使用起来非常灵活便捷

(3).提供了更多的控制能力以及操作队列中所不能使用的底层函数

GCD的基本思想是就将操作s放在队列s中去执行
(1)操作使用Blocks定义
(2)队列负责调度任务执行所在的线程以及具体的执行时间
(3)队列的特点是先进先出(FIFO)的,新添加至对列的操作都会排在队尾

提示
GCD的函数都是以dispatch(分派、调度)开头的
队列
dispatch_queue_t
串行队列,队列中的任务只会顺序执行
并行队列,队列中的任务通常会并发执行
操作
dispatch_async异步操作,会并发执行,无法确定任务的执行顺序
dispatch_sync同步操作,会依次顺序执行,能够决定任务的执行顺序

串行队列

<span style="font-size:12px;">//1.创建队列
//demoqueue 队列名称,在调试时辅助
dispatch_queue_t q = dispatch_queue_create("demoqueue", DISPATCH_QUEUE_SERIAL);

//同步操作。不会新建线程(没用)
dispatch_sync(q, ^{
NSLog(@"串行同步 %@", [NSThread currentThread]);
});

//异步操作。会新建线程。(非常有用)
//场景:既不影响主线程,又需要顺序执行的操作
dispatch_async(q, ^{
NSLog(@"串行异步 %@", [NSThread currentThread]);
});</span><span style="font-size: 32pt;">
</span>
并行队列

//1.创建并行队列
dispatch_queue_t q = dispatch_queue_create("demoqueue", DISPATCH_QUEUE_CONCURRENT);

//同步操作不会新建线程、操作顺序执行
dispatch_sync(q, ^{
NSLog(@"并行同步 %@", [NSThread currentThread]);
});

//异步操作会新建多个线程,操作无序执行(有用但容易出错)
dispatch_async(q, ^{
NSLog(@"并行异步 %@", [NSThread currentThread]);
});


全局队列

<span style="font-size:12px;">//1.全局队列是系统的,直接拿过来(GET)用就可以
dispatch_queue_t q = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

//异步会新建多个线程、操作无序执行
dispatch_async(q, ^{
NSLog(@"全局异步 %@ %d", [NSThread currentThread], i);
});

//同步操作不会新建线程、操作顺序执行
dispatch_sync(q, ^{
NSLog(@"全局同步 %@ %d", [NSThread currentThread], i);
});</span>


主队列

//1.每一个应用程序对应唯一主队列,直接GET得到
//在多线程开发中,使用主队列更新UI
dispatch_queue_t q = dispatch_get_main_queue();

//主队列中的操作都应该在主线程上顺序执行的,不存在异步的概念
dispatch_async(q, ^{
NSLog(@"主队列异步 %@", [NSThread currentThread]);
});

//主队列添加的同步操作永远不会被执行,会死锁
dispatch_sync(q, ^{
NSLog(@"主队列同步 %@", [NSThread currentThread]);
});


GCD阶段性小结

GCD
(1)通过GCD,开发者不用再直接跟线程打交道,只需要向队列中添加代码块即可
(2)GCD在后端管理着一个线程池,GCD不仅决定着代码块将在哪个线程被执行,它还根据可用的系统资源对这些线程进行管理。从而让开发者从线程管理的工作中解放出来,通过集中的管理线程,缓解大量线程被创建的问题
(3)使用GCD,开发者可以将工作考虑为一个队列,而不是一堆线程,这种并行的抽象模型更容易掌握和使用

GCD的队列
(1)GCD公开有5个不同的队列:运行在主线程中的主队列,3个不同优先级的后台队列,以及一个优先级更低的后台队列(用于I/O)
(2)自定义队列:串行和并行队列。自定义队列非常强大,建议在开发中使用。在自定义队列中被调度的所有Block最终都将被放入到系统的全局队列中和线程池中
(3)提示:不建议使用不同优先级的队列,因为如果设计不当,可能会出现优先级反转,即低优先级的操作阻塞高优先级的操作
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: