GCD为我们提供了三种类型的调度队列(dispatch queue),分别为串行,并行和主调度队列。

串行(Serial)

    你可以创建任意个数的串行队列,每个队列依次执行添加的任务,一个队列同一时刻只能执行一个任务(串行),但是各个队列之间不影响,可以并发执行。每个队列中的任务运行在一个由各自串行队列维护的独立线程上,一个队列中只有一个线程。
  下面,我将创建一个串行队列,添加两个任务,来演示串行执行的过程。
  

 1 UInt32 loopCount = 1000;
2
3 void (^taskFirst)(void) = ^{
4 NSLog(@"taskFirst 任务开始执行\r\n");
5
6 for (UInt32 i = 0; i < loopCount; i++) {
7
8 }
9 NSLog(@"taskFirst 任务结束\r\n");
10 };
11
12 void (^taskSecond)(void) = ^{
13 NSLog(@"taskSecond任务开始执行\r\n");
14 for (UInt32 i = 0; i < loopCount; i ++) {
15
16 }
17 NSLog(@"taskSecond 任务结束\r\n");
18 };
19 dispatch_queue_t serialQueue;
20 serialQueue = dispatch_queue_create("serialDemo", NULL);
21 dispatch_async(serialQueue, taskFirst);
22 NSLog(@"taskfirst 已经加入队列\r\n");
23 dispatch_async(serialQueue, taskSecond);
24 NSLog(@"tasksecond 已经加入队列\r\n");

运行得到结果1:

2012-05-14 18:45:01.766 GDCDemo[389:f803] taskfirst 已经加入队列

2012-05-14 18:45:01.766 GDCDemo[389:11103] taskFirst 任务开始执行

2012-05-14 18:45:01.767 GDCDemo[389:f803] tasksecond 已经加入队列

2012-05-14 18:45:01.768 GDCDemo[389:11103] taskFirst 任务结束

2012-05-14 18:45:01.768 GDCDemo[389:11103] taskSecond任务开始执行

2012-05-14 18:45:01.772 GDCDemo[389:11103] taskSecond 任务结束

运行结果跟我们的预计一样,taskFirst执行完之后,才执行taskSecond。而且,通过“xxx任务加入队列”的提示,任务运行的线程跟主线程不是同一个。

下面,我们继续对代码做点调整,让它演示不同队列之间的任务并行运行。

 1 UInt32 loopCount = 1000;
2 UInt32 loopCountFirst = 10000000;
3
4 void (^taskFirst)(void) = ^{
5 NSLog(@"taskFirst 任务开始执行\r\n");
6
7 //延长taskFirst的运行时间
8 for (UInt32 i = 0; i < loopCountFirst; i++) {
9
10 }
11 NSLog(@"taskFirst 任务结束\r\n");
12 };
13
14 void (^taskSecond)(void) = ^{
15 NSLog(@"taskSecond任务开始执行\r\n");
16 for (UInt32 i = 0; i < loopCount; i ++) {
17
18 }
19 NSLog(@"taskSecond 任务结束\r\n");
20 };
21 dispatch_queue_t serialQueue;
22 serialQueue = dispatch_queue_create("serialDemo", NULL);
23 //创建第二个队列
24 dispatch_queue_t serialQueueSecond = dispatch_queue_create("serialSecondDemo", NULL);
25 dispatch_async(serialQueue, taskFirst);
26 NSLog(@"taskfirst 已经加入队列\r\n");
27 dispatch_async(serialQueueSecond, taskSecond);
28 NSLog(@"tasksecond 已经加入队列\r\n");

运行得到结果2:

2012-05-14 19:07:22.951 GDCDemo[456:f803] taskfirst 已经加入队列

2012-05-14 19:07:22.951 GDCDemo[456:11103] taskFirst 任务开始执行

2012-05-14 19:07:22.953 GDCDemo[456:f803] tasksecond 已经加入队列

2012-05-14 19:07:22.953 GDCDemo[456:12c03] taskSecond任务开始执行

2012-05-14 19:07:22.954 GDCDemo[456:12c03] taskSecond 任务结束

2012-05-14 19:07:22.977 GDCDemo[456:11103] taskFirst 任务结束

由此可见,taskSecond是添加到队列后立即执行的。两个串行队列之间的任务是互不影响的。

并行(Concurrent)

    并行队列是不允许自己创建的,系统中存在三个不同优先级的并行队列。并行队列依旧按照任务添加的顺序启动任务,但是,后一个任务无须等待前一个任务执行完毕,而是启动第一个任务后,立即启动下一个任务。至于同一时刻允许同时运行多少个任务有系统决定。任务各自运行在并行队列为他们提供的独立线程上,并行队列中同时运行多少个任务,就必须维护多少个线程。
下面,我们将上一个程序的第21到28行替换为如下代码:
1 dispatch_queue_t concurrentQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
2 dispatch_async(concurrentQueue, taskFirst);
3 NSLog(@"taskfirst 已经加入队列\r\n");
4 dispatch_async(concurrentQueue, taskSecond);
5 NSLog(@"tasksecond 已经加入队列\r\n");

运行,结果与结果2相同。说明了,taskFirst和taskSecond是同时运行的。

  

主调度队列(main dispatch queue)

    主调度队列中的任务运行在应用程序主线程上,所以,如果你要修改应用程序的界面,他是唯一的选择。
  演示代码如下:

dispatch_async(dispatch_get_main_queue(), ^{

.....//跟新界面的操作

});

 
 
博客内容是我学习的总结,如果有错误,希望大家指出。

GCD总结(一)的更多相关文章

  1. Objective-C三种定时器CADisplayLink / NSTimer / GCD的使用

    OC中的三种定时器:CADisplayLink.NSTimer.GCD 我们先来看看CADiskplayLink, 点进头文件里面看看, 用注释来说明下 @interface CADisplayLin ...

  2. iOS 多线程之GCD的使用

    在iOS开发中,遇到耗时操作,我们经常用到多线程技术.Grand Central Dispatch (GCD)是Apple开发的一个多核编程的解决方法,只需定义想要执行的任务,然后添加到适当的调度队列 ...

  3. 【swift】BlockOperation和GCD实用代码块

    //BlockOperation // // ViewController.swift import UIKit class ViewController: UIViewController { @I ...

  4. 修改版: 小伙,多线程(GCD)看我就够了,骗你没好处!

    多线程(英语:multithreading),是指从软件或者硬件上实现多个线程并发执行的技术.具有多线程能力的计算机因有硬件支持而能够在同一时间执行多于一个线程,进而提升整体处理性能.具有这种能力的系 ...

  5. GCD的相关函数使用

    GCD 是iOS多线程实现方案之一,非常常用 英文翻译过来就是伟大的中枢调度器,也有人戏称为是牛逼的中枢调度器 是苹果公司为多核的并行运算提出的解决方案 1.一次性函数 dispatch_once 顾 ...

  6. hdu1695 GCD(莫比乌斯反演)

    题意:求(1,b)区间和(1,d)区间里面gcd(x, y) = k的数的对数(1<=x<=b , 1<= y <= d). 知识点: 莫比乌斯反演/*12*/ 线性筛求莫比乌 ...

  7. hdu2588 GCD (欧拉函数)

    GCD 题意:输入N,M(2<=N<=1000000000, 1<=M<=N), 设1<=X<=N,求使gcd(X,N)>=M的X的个数.  (文末有题) 知 ...

  8. BZOJ 2820: YY的GCD [莫比乌斯反演]【学习笔记】

    2820: YY的GCD Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 1624  Solved: 853[Submit][Status][Discu ...

  9. BZOJ 2818: Gcd [欧拉函数 质数 线性筛]【学习笔记】

    2818: Gcd Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 4436  Solved: 1957[Submit][Status][Discuss ...

  10. GCD总结

    //用block只有两种:同步执行/异步执行(参数1:队列;参数二:任务) dispatch_async(dispatch_get_global_queue(0, 0),^{ });//异步在新的线程 ...

随机推荐

  1. Python面向对象之多态

    多态 面向对象三大特性 封装 根据职责将属性和方法封装到一个抽象的类中:--定义类的准则 继承 实现代码的重用,相同的代码不需要重复的编写:--设计类的技巧:子类针对自己的需求,编写特定的代码: 多态 ...

  2. 测试第一个Oracle存储过程

    存储过程语句 //简单存储过程的例子 //每调用一次打印一次hello world create or replace procedure sayhelloworld as begin dbms_ou ...

  3. LeetCode(60) Permutation Sequence

    题目 The set [1,2,3,-,n] contains a total of n! unique permutations. By listing and labeling all of th ...

  4. 关于必须添加对程序集“System.Runtime, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a”的引用异常问题

    问题描述: 下午调试代码的时候突然发现页面突然异常了,原本以为是代码哪里写错了,后来通过定位发现MVC,UI界面的Linq异常,即关于必须添加对程序集“System.Runtime, Version= ...

  5. node.js里的buffer常见操作,copy,concat等实例讲解

    //通过长度构建的buffer内容是随机的 var buffer=new Buffer(100); console.log(buffer); //手动清空buffer,一般创建buffer不会清空 b ...

  6. Linux下汇编语言学习笔记63 ---

    这是17年暑假学习Linux汇编语言的笔记记录,参考书目为清华大学出版社 Jeff Duntemann著 梁晓辉译<汇编语言基于Linux环境>的书,喜欢看原版书的同学可以看<Ass ...

  7. Linux下汇编语言学习笔记61 ---

    这是17年暑假学习Linux汇编语言的笔记记录,参考书目为清华大学出版社 Jeff Duntemann著 梁晓辉译<汇编语言基于Linux环境>的书,喜欢看原版书的同学可以看<Ass ...

  8. 牛客网小白月赛1 B,I

    #include <stdio.h> #include <math.h> #include <string.h> #include <stdlib.h> ...

  9. HTML5 全屏化操作功能

    由于项目中用到了全屏化挫折功能,查看了API后写了一个简单的全屏化model <!DOCTYPE html> <html> <head> <meta http ...

  10. 洛谷 P1555 尴尬的数字

    P1555 尴尬的数字 题目背景 Bessie刚刚学会了不同进制数之间的转换,但是她总是犯错误,因为她的两个前蹄不能轻松的握住钢笔. 题目描述 每当Bessie将一个数转换成新的进制时,她总会写错一位 ...