多线程编程之GCD(一)
什么是GCD (Grand Central Dispatch)
【摘自官方文档】GCD是异步执行任务的技术之一。一般将应用程序中记述的线程管理用的代码在系统级中实现。开发者只需要定义想执行的任务并追加到适当的Dispatch Queue中,GCD就能生成必要的线程并计划执行任务。由于线程的管理作为系统的一部分实现的,因此可统一管理,也可执行任务,这样就比以前的线程更有效率。
从上段文字中可以知道:
1、GCD是异步执行任务的技术之一;
2、GCD自动生成线程;
3、关键是高效;
下面通过GCD的API感受下GCD的强大:
一、Dispatch Queue
【官方说明】开发者要做的只是定义想要执行的任务并追加到适当的Dispatch Queue中。
字面上理解即‘队列’,开发者只需要把想要执行的任务放到队列中,Dispatch Queue会按照FIFO(先进先出)的顺序执行处理;
创建一个Dispatch Queue的API
dispatch_queue_t
dispatch_queue_create(const char *_Nullable label,
dispatch_queue_attr_t _Nullable attr);
需要知道的是在执行处理中存在两种Dispatch Queue:1、串行队列;2、并行队列;在API中体现在第二个参数里,串行队列——DISPATCH_QUEUE_SERIAL
,并行队列——DISPATCH_QUEUE_CONCURRENT
dispatch_queue_t serialQueue = dispatch_queue_create("com.qmf",
DISPATCH_QUEUE_SERIAL);
dispatch_queue_t concurrentQueue = dispatch_queue_create("com.qmf",
DISPATCH_QUEUE_CONCURRENT);
下面通过一段代码比较两者的区别:
S:
dispatch_async(serialQueue, ^{ NSLog(@"1") });
dispatch_async(serialQueue, ^{ NSLog(@"2") });
dispatch_async(serialQueue, ^{ NSLog(@"3") });
dispatch_async(serialQueue, ^{ NSLog(@"4") });
C:
dispatch_async(concurrentQueue, ^{ NSLog(@"1") });
dispatch_async(concurrentQueue, ^{ NSLog(@"2") });
dispatch_async(concurrentQueue, ^{ NSLog(@"3") });
dispatch_async(concurrentQueue, ^{ NSLog(@"4") });
------------------------------华丽的分割线----------------------------------------
先不要往下看自己预测下S和C分别输出结果会是什么?
serialQueue是一个串行队列,一次只生成一个线程,添加的所有任务都只能在这一个线程中执行;
concurrentQueue是一个并行队列,一次可以生成多个线程,添加的任务可以在多个线程中同时执行;
输出:
S:
1
2
3
4
C:(不唯一)
2
1
3
4
二、dispatch_queue_create
dispatch_queue_t
dispatch_queue_create(const char *_Nullable label,
dispatch_queue_attr_t _Nullable attr);
参数一:指定queue的名称
参数二:指定queue的类型
>注意:在GCD的API中,名称中含有‘create’的,当不需要生成的对象时,需要使用dispatch_release()函数释放;
------------------------------未完待续--------------------------------------------
不懂就[药问](http://www.51question.com "")