ios多线程--GCD

(Grand Central Dispatch)多线程优化技术,GCD的使用离不开Dispatch

1、什么是GCD

是一套底层API,基于C语言开发的多线程机制,提供了新的模式编写并发执行的程序;

2、GCD特点

(1)允许将一个程序分为多个单一的任务,提到工作队列当中串行或者并发执行

(2)配合了Block使用起来更加灵活

(3)自动管理线程的生命周期(创建线程、调度任务、线程销毁)完全不用我们管理,只需要告诉它任务是什么就行

(4)为多核的并行运算提出了解决方案,能够合理的利用CPU内核(比如双核、四核)

3、什么是Queue队列

GCD使用了队列的概念,解决了NSThread难于管理的问题,队列实际上就是数组的概念,通常是把要执行的任务放到队列里就ok了

4、Queue特点

(1)按顺序执行,先进先出

(2)队列可以管理多线程、管理任务、设置主线程

(3)GCD的队列是任务的队列、而不是线程的队列

5、什么是任务

任务即操作:你想要干什么、说白了就是一段代码、在GCD中就是一个Block

任务的执行方式:

(1)同步执行:只要是同步、都会在当前线程执行、不会另开线程

(2)异步执行:只要是异步、都会开启新线程、在新开启的线程中执行

6、什么是串行队列(排队)

依次执行每一个任务

7、什么是并行队列(一起跑、谁快谁先)

好像所有任务都是在同一时间段执行的

8、都有哪些队列

主队列(MainQueue)、全局队列(Global Queue)、自定义的(Queue)

GCD的任务队列 (三种)

串行队列,同步任务,不需要新建子线程

串行队列,异步任务,需要一个子线程,线程的创建和回收不需要程序员参与

并行队列,同步任务,不需要创建线程

并行队列,异步任务,有多少个任务,就开N个线程执行(不可控制)

dispatch 它是GCD技术常用变量和函数的前缀名

1、自定义队列

2、获取全局队列

3、获取主队列

(1)自定义队列

0、创建队列

参数一、给一个运行标记,可以为NULL

参数二、属性,一般为NULL

dispatch_queue_t myQueue = dispatch_queue_create("myQueue", NULL);

1、同步(只要是同步就不会开线程)

dispatch_sync

2、异步 

dispatch_async

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

3、多队列

dispatch_async

每个线程的任务先执行一步、在依次(随机)执行第二步……

4、组队列

能够实现全部任务都执行完后再执行某事

(1)将事件统一添加到组里

dispatch_group_async(group, queue1, ^{

(2)组内所有方法执行完毕,就会调用通知

dispatch_group_notify(group, queue4, ^{

(2)全局队列

1、获取  dispatch_get_global_queue

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0)

参数一:运行级别标识(高2,默认0,低-2,后台)

参数二:,标记,一般给个0就可以

2、特点:

        1.可以同时运行多个任务,每个任务的启动时间是按照加入queue的顺序执行的

        2.全局队列能够实现并行,只要是异步执行,就会开启线程(虽然都在全局队列里)

        3.我们不能自己创建,只能获取和调度

(3)主队列

1、获取主队列的方法

dispatch_async(dispatch_get_main_queue(), ^{

2、主队列常见错误(sync同步等待主队列、主队列等待sync返回、所以会卡死)

NSLog(@"1");

    dispatch_sync(dispatch_get_main_queue(), ^{

        NSLog(@"2");

    });

    NSLog(@"3");

原文地址:https://www.cnblogs.com/gaduo/p/4996558.html