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. js 技巧 (八)JS代码判断集锦(之二)

    JS代码判断集锦(之二) <INPUT TYPE="button" value="登录"  tabindex="4"> < ...

  2. assert.ok()详解

    assert.ok(value[, message]) 测试 value 是否为真值.它等同于 assert.equal(!!value, true, message). 如果 value 不是真值, ...

  3. 爬虫项目 之(一) --- urllib 和 正则re

    from urllib import request,parse from time import sleep import re # 1.[数据的获取] # 封装一个函数,用于将url转化成一个请求 ...

  4. Online IDE & Public URLs & turbo

    Online IDE powered by Visual Studio Code https://stackblitz.com/ https://www.polymer-project.org/3.0 ...

  5. [luoguP1040] 加分二叉树(DP)

    传送门 区间DP水题 代码 #include <cstdio> #include <iostream> #define N 41 #define max(x, y) ((x) ...

  6. HDU 4944

    FSF’s game Problem Description FSF has programmed a game.In this game, players need to divide a rect ...

  7. [NOIP2007] 提高组 洛谷P1098 字符串的展开

    题目描述 在初赛普及组的“阅读程序写结果”的问题中,我们曾给出一个字符串展开的例子:如果在输入的字符串中,含有类似于“d-h”或者“4-8”的字串,我们就把它当作一种简写,输出时,用连续递增的字母获数 ...

  8. openjudge7627 鸡蛋的硬度

    描述 最近XX公司举办了一个奇怪的比赛:鸡蛋硬度之王争霸赛.参赛者是来自世 界各地的母鸡,比赛的内容是看谁下的蛋最硬,更奇怪的是XX公司并不使用什么精密仪器来测量蛋的硬度,他们采用了一种最老土的办法- ...

  9. Mysql中错误日志、binlog日志、查询日志、慢查询日志简单介绍

    前言 数据库的日志是帮助数据库管理员,追踪分析数据库以前发生的各种事件的有力根据.mysql中提供了错误日志.binlog日志(二进制日志).查处日志.慢查询日志.在此,我力求解决下面问题:各个日志的 ...

  10. Django学习系列之ORM-QuerySetAPI

    基本操作 # 增 models.Tb1.objects.create(c1='xx', c2='oo') #增加一条数据,可以接受字典类型数据 **kwargs obj = models.Tb1(c1 ...