在iOS开发中,苹果提供了三种多线程技术,分别是:

(1)NSThread

(2)NSOperation

(3)GCD

简单介绍一下GCD的使用。

GCD全称 Grand Central Dispatch,可以称之为大中央调度。实际上GCD是管理着一个线程池,如何创建线程,如何回收线程,以及分配多少个线程,这些都是GCD来控制的。在开发中,程序员是不用操作线程的相关事情,程序员只需要把应该做的操作放到相应的队列里面即可。

一:自定义队列

GCD中有多种队列,其中自定义的队列有两种:串行队列和并行队列

1:串行队列:队列中的任务只会顺序执行,且一次只能够执行一个任务。也就是说,执行完一个任务后,才会执行下一个任务。

2:并行队列:可以一次执行多个任务。比如说并行队列中有10个任务,可以一次执行3个任务,这三个任务哪个先执行完了,再接着执行剩下的任务。

注意:无论是串行队列还是并行队列,他们都是FIFO(先进先出)的。也就是说,无论是哪种队列,任务进队列的时间越早,其执行的时间就越早(只不过某些情况下任务执行的结束时间是不确定的)。

GCD中有两种操作,分别是同步操作和异步操作

1:同步操作:不会新开线程

2:异步操作:会开启新的线程

两种操作和两种队列,组合为4种情况,实际上,在开发中,有些组合基本上是不会用到的。下面用程序描述一下四种组合。

组合一:串行队列+同步操作(不会新建线程,而且任务是一个一个的执行,因此实际上就是顺序执行),代码如下:

- (void)gcdDemo1
{
//串行队列+同步操作
dispatch_queue_t queue = dispatch_queue_create("gcddemo", DISPATCH_QUEUE_SERIAL);
for(int i = 0; i < 10; ++i){
dispatch_sync(queue, ^{
NSLog(@"%@ %d",[NSThread currentThread],i);
});
}
}

执行结果:

number = 1,说明是主线程,没有新开线程。

组合二:串行队列+异步操作(因为任务要一个一个的执行,但是因为是异步操作,所以会开启一个新的线程,所有的任务都在新的线程上执行),代码如下:

- (void)gcdDemo1
{
dispatch_queue_t queue = dispatch_queue_create("gcddemo", DISPATCH_QUEUE_SERIAL);
//串行队列+异步操作
for (int i = ; i < ; ++i){
dispatch_async(queue, ^{
NSLog(@"%@ %d",[NSThread currentThread],i);
});
}
}

执行结果:

number = 2,说明开启了一个新的子线程,但仍然是顺序执行。

组合三:并行队列+同步操作(因为同步操作不会开启新的线程,因此,即使并行队列可以一次开始多个任务,但实际上仍旧是每个任务都在主线程上执行,且按顺序执行)。代码如下:

- (void)gcdDemo2
{
dispatch_queue_t queue = dispatch_queue_create("gcddemo", DISPATCH_QUEUE_CONCURRENT);
//并行队列+同步任务
for(int i = ; i < ; ++i){
dispatch_sync(queue, ^{
NSLog(@"%@ %d",[NSThread currentThread],i);
});
}
}

执行结果:

没有开启新的线程,且按顺序执行。

组合四:并行队列+异步操作(并行队列会一次开始多个任务,且异步操作可以开启新的线程,因此同一时刻可能会同时执行多个任务,开启多个线程,且每个任务的结束时间是不确定的)。代码如下:

- (void)gcdDemo2
{
dispatch_queue_t queue = dispatch_queue_create("gcddemo", DISPATCH_QUEUE_CONCURRENT);
//并行队列+异步任务
for(int i = ; i < ; ++i){
dispatch_async(queue, ^{
NSLog(@"%@ %d",[NSThread currentThread],i);
});
}
}

执行结果:

可以看到,开启了多个线程,且任务不是按顺序执行完的。

二:全局队列

为了方便开发,苹果还提供了有全局队列,全局队列实际上是并行队列,因此,全局队列的执行结果和并行队列的执行结果是一致的。代码如下:

全局队列+同步任务:

- (void)gcdDemo3
{
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, );
//全局队列+同步任务
for (int i = ; i < ; ++i){
//同步任务
dispatch_sync(queue, ^{
NSLog(@"%@ %d",[NSThread currentThread],i);
});
}
}

执行结果:

全局队列+异步任务:

- (void)gcdDemo3
{
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, );
//全局队列+异步任务
for(int i = ; i < ; ++i){
dispatch_async(queue, ^{
NSLog(@"%@ %d",[NSThread currentThread],i);
});
}
}

执行结果:

三:主队列

苹果还提供了一种队列是主队列,主队列是串行队列,但是和串行队列又有差异。主队列上的任务都应该在主线程上顺序执行,没有异步的概念。也就是说,即使是异步任务在主队列上执行,也不会开启新的线程。

主队列+异步任务:

- (void)gcdDemo4
{
dispatch_queue_t queue = dispatch_get_main_queue();
//主队列+异步任务
for(int i = ; i < ; ++i){
dispatch_async(queue,^{
NSLog(@"%@ %d",[NSThread currentThread],i);
});
}
}

执行结果:

可以看到,没有开启新的线程,且是顺序执行。

主队列+同步任务(会阻塞线程),代码如下:

- (void)gcdDemo4
{
dispatch_queue_t queue = dispatch_get_main_queue();
//主队列+同步任务,会阻塞
for(int i = ; i < ; ++i){
dispatch_sync(queue, ^{
NSLog(@"%@ %d",[NSThread currentThread],i);
});
}
}

阻塞原因:

主队列中本身是有一个任务A的(主任务),且该任务A还没有执行完。在执行任务A的过程中,又插入了新的同步任务B。我们知道,串行队列中,必须先执行完一个任务后,才能继续执行另一个任务。此时的情况时:

若想继续执行任务A,需要先把任务B执行完,若想继续执行任务B,需要先把任务A执行完,因此造成了阻塞。

在开发中,应该避免这种阻塞的情况。

iOS多线程GCD的简单使用的更多相关文章

  1. iOS多线程 GCD

    iOS多线程 GCD Grand Central Dispatch (GCD)是Apple开发的一个多核编程的解决方法. dispatch queue分成以下三种: 1)运行在主线程的Main que ...

  2. iOS 多线程 GCD part3:API

    https://www.jianshu.com/p/072111f5889d 2017.03.05 22:54* 字数 1667 阅读 88评论 0喜欢 1 0. 预备知识 GCD对时间的描述有些新奇 ...

  3. iOS 多线程GCD的基本使用

    <iOS多线程简介>中提到:GCD中有2个核心概念:1.任务(执行什么操作)2.队列(用来存放任务) 那么多线程GCD的基本使用有哪些呢? 可以分以下多种情况: 1.异步函数 + 并发队列 ...

  4. iOS多线程——GCD与NSOperation总结

    很长时间以来,我个人(可能还有很多同学),对多线程编程都存在一些误解.一个很明显的表现是,很多人有这样的看法: 新开一个线程,能提高速度,避免阻塞主线程 毕竟多线程嘛,几个线程一起跑任务,速度快,还不 ...

  5. iOS多线程GCD的使用

    1. GCD 简介 Grand Central Dispatch(GCD)是异步执行任务的技术之一.一般将应用程序中记述的线程管理用的代码在系统级中实现.开发者只需要定义想执行的任务并追加到适当的Di ...

  6. iOS多线程——GCD篇

    什么是GCD GCD是苹果对多线程编程做的一套新的抽象基于C语言层的API,结合Block简化了多线程的操作,使得我们对线程操作能够更加的安全高效. 在GCD出现之前Cocoa框架提供了NSObjec ...

  7. ios多线程-GCD基本用法

    ios中多线程有三种,NSTread, NSOperation,GCD 这篇就讲讲GCD的基本用法 平时比较多使用和看到的是: dispatch_async(dispatch_get_global_q ...

  8. iOS多线程——GCD

    最近的项目遇到了很多多线程的问题,借此机会对GCD进行了一番学习并总结.首先说一下什么是GCD,GCD全称 Grand Central Dispatch,是异步执行任务的技术之一.开发者只需要定义想要 ...

  9. iOS多线程GCD详解

    在这之前,一直有个疑问就是:gcd的系统管理多线程的概念,如果你看到gcd管理多线程你肯定也有这样的疑问,就是:并发队列怎么回事,即是队列(先进先出)怎么会并发,本人郁闷了好久,才发现其实cgd管理多 ...

随机推荐

  1. 解决本地调用office组件成功,但是发布到IIS中出现的错误(检索COM类工厂中CLSID为{00024500-0000-0000-C000-000000000046}的组件时失败)

    在C#操作word或者Excel,我们可能会用到微软内置的COM组件,会出现很多问题. 如:在本地调试导出Excel没有问题,发布到IIS就有问题了,检测到的异常: 我们会发现在iis上运行的程序,没 ...

  2. 深入GCD(二): 多核心的性能

    概念为了在单一进程中充分发挥多核的优势,我们有必要使用多线程技术(我们没必要去提多进程,这玩意儿和GCD没关系).在低层,GCD全局dispatch queue仅仅是工作线程池的抽象.这些队列中的Bl ...

  3. iOS10你掉坑了吗?

    坑1: 系统导航栏上按键消失问题 坑2: canOpenURL 调用返回NO问题 坑3: iOS10 权限崩溃问题 坑4: xib不好用了?别怕看这里! 坑5: command +/注释失效 坑6: ...

  4. firefox os 开发模拟器1.4版本号安装开发具体解释

    首先在使用firefox os 模拟器的时候必须先下载firefox 浏览器,这个是众多web开发人员必备的工具,下载地址firefox 浏览器 .在最新的官方版本号是1.5版的模拟器,可是如今还不是 ...

  5. weex 项目 创建 远程 icon

    一.创建 远程 icon 步骤一:打开  阿里巴巴矢量图标库 官网:http://www.iconfont.cn/ 步骤二:选择项目需要的 icon 步骤三:添加到项目(没有项目会自动创建) 步骤四: ...

  6. Linux系统调用(syscall)原理(转)

    引言:分析Android源码的过程中,要想从上至下完全明白一行代码,往往涉及app.framework.native一直到kernel,可能迷失到代码世界,明白了系统调用原理,或许能帮你峰回路转,找到 ...

  7. saltstack安装配置(syndic)

    syndic是saltstack用来做集群部署的,一般结构如图: syndic是一个特殊的minion,syndic类继承于minion类,syndic可以看作一个代理,只做数据传递. CentOS上 ...

  8. OpenStack源码系列---nova-conductor

    nova-conductor启动的也是一个rpc server,代码框架和nova-compute类似,所以我也懒得再详细分析一遍服务启动的过程.nova-api那篇文章的最后我说"cctx ...

  9. Android(Linux)模拟按键、触摸屏等事件

    前提: 在我们应用程序或者在写Android自己主动化測试时候经常会须要模拟实体按键,来给我们做測试用.这也是我要整理的目的. 基本的涉及的是Linux Input Event事件. 下面的样例基于A ...

  10. 持续集成-jenkins 环境搭建

    转自:http://blog.jxdev.me/blog/2015/03/26/jian-xin-de-chi-xu-ji-cheng-zhi-lu-%5B%3F%5D-da-jian-jenkins ...