关于GCD的一些介绍及相关使用

来源:互联网 发布:混沌与秩序2随从数据库 编辑:程序博客网 时间:2024/05/02 01:19
GCD:Grand Center Dispatch (多线程优化技术),GCD的时候用离不开dispatch,是一套底层的API,基于C语言开发的多线程机制,提供了新的模式编写并发执行的程序

GCD特点:
1.允许将一个程序分为多个单一的任务,提交到工作队列当中,串行或者并发执行
2.配合block使用起来更加方便灵活
3.自动管理线程的生命周期(创建,调度,销毁),完全不需要我们手动管理,只告诉他任务就好
4.同时为多核并行处理器提供了解决方案,自动合理的利用CPU

什么是Queue队列?
GCD使用了队列的概念,管理线程执行任务,解决了NSThread难于管理的问题;
队列实际上就是数组的概念,通常都是吧要执行的任务添加到队列中
特点:
1.按照顺序执行,先进先出
2.队列可以管理多线程,管理并发执行的任务,可以设置主线程
3.GCD的队列是任务的队列,而不是线程的队列

什么是任务
1.任务即操作,你想要干什么,说白了就是一段代码,就是block里的东西
2.任务两种执行方式:    
     同步执行:当前无返回不往下走,只要不开线程,都在当前线程走
     异步执行:并发的,只要是异步的,都会开启线程,在新的线程中执行

什么是串行队列
依次执行队列中的每一个任务

什么是并行队列
好像所有任务都是同一时间开始执行的

都有哪些队列
主队列,全局队列,自定义队列


GCD的任务队列有三种:
1.自定义队列
2.获取全局队列
3.获取主队列

异步:
任务在同一个队列里面是串行的
只要是异步,肯定开线程

全局队列特点:
1.可以同时执行多个任务,每个任务的启动时间是按照添加到queue的顺序执行的
2.全局队列能够实现并行,获取不同的全局队列,开启的线程不同,想要串行必须写在同一个block里面
3.我们不能自己手动创建,只能获取和调度

iOS中如何实现一个真正的单例(使用GCD)
1.首先要保证allocWithZone是线程安全的,当调用super方法的时候使用dispatch_once方法锁住
2.还要保证单例方法中也使用了dispatch_once方法锁住创建对象的过程
3.必须给一个全局的静态变量,要创建的单例类型

GCD方法获取主线程
dispatch_async(dispatch_get_main_queue(), ^{/*方法*/});


GCD队列可分为两大类:
并发队列:可以让多个任务并发(同时)执行,自动开启多个线程同时执行任务,并发功能只有在异步dispatch_async函数下才生效
串行队列:让任务一个接一个的执行(一个任务执行完毕后,再执行下一个任务)

同步异步主要影响:能不能开启新线程
同步:在新的线程中执行任务,不具备开启新线程的功能
异步:在新的线程中执行任务,具备开启新线程的功能

并发和串行主要影响:任务的执行方式
并发:多个任务同时执行
串行:一个任务执行完毕后,再执行另一个任务

异步并发队列:会同时创建多条线程
dispatch_queue_t queue = dispatch_global_queue(0,0);
dispatch_async(queue,^{
//code block;
});

异步串行队列:会创建新线程,一般只会开启一条线程
dispatch_queue_t queue = dispatch_queue_create(“queueName”,NULL);
dispatch_async(queue,^{
//code block;
});

同步并发队列:不会创建新的线程,(串行执行,一个任务执行完毕后再执行下一个任务)
dispatch_sync_t queue = dispatch_get_global_queue(0,0);
dispatch_sync(queue,^{
//code block;
});

同步串行队列:不会创建新的线程,(串行执行,一个任务执行完毕后再执行一下个任务)
dispatch_sync_t queue = dispatch_queue_create(“queueName”,NULL);
dispatch_sync(queue,^{
//code block;
});





0 0