下面是:2个并发进程、和2个并发线程的示意图:

下面介绍三种多线程技术(Thread、Cocoa Operation、Grand Central Dispatch):

1、最轻量级Thread(需要自己管理线程的生命周期和同步,所以不常用):线程同步对数据的加锁会导致一定的系统开销。但偶尔也会有一定的用处,如Thread.current可以获得当前线程,这种使用就很方便。

//下面是创建Thread的两种方法
//方法一:使用类方法,创建线程(创建好,就启动了)
Thread.detachNewThreadSelector(#selector(addOne), toTarget: self, with: nil)
//方法二:线程实例化,采用便利构造器
let thread2 = Thread(target: self, selector: #selector(addTwo), object: nil)
thread2.start()

2、Cocoa Operation(相关类Operation和OperationQueue):这种方法就不需要关心线程管理和数据同步,只需把重点放在多线程分别要执行的任务。

其中Operation是个抽象类,使用它必须用它的子类,可以自定义,也可以用BlockOperation类。要让Operation子类的对象,执行它的任务(方法),就需要把这个对象,add进入OperationQueue对象的操作队列,依次执行:
let blockOne = BlockOperation(block: addOne)
let blockTwo = BlockOperation(block: addTwo)
let queue = OperationQueue()
queue.addOperation(blockOne)
queue.addOperation(blockTwo)

3、Grand Central Dispatch(GCD):

GCD会自动合理地利用更多的CPU内核(即根据系统负载来自动增减线程数量,从而减少了上下文切换,而增加计算效率)、自动管理线程的生命周期(如创建线程、调度任务、自动同步,无需加锁、销毁线程等,使用就不用过多关心这些与处理事物无关的代码),所以方便的GCD是我们学习iOS多线程的重点。
使用GCD就是使用dispatch queue(调度队列)的对象,用来接受任务并执行,而且与以上两种方法不同的是,dispatch queue是可以并发的,也可以FIFO串行。

GCD有两种队列(串行、并行,一个队列对象就代表一个线程),用于存放任务,任务的执行也有两种同步、异步执行。具体如何执行,理解下图:

创建队列

主队列:主线程中的唯一队列,用于刷新UI(因为主线程主队列是唯一的,所以这种操作也是串行的),所以其他的耗时任务要放到其他线程的队列中执行。获得主队列:let mainQueue = DispatchQueue.main

自定义队列:

对于并行队列,有4个常用的执行优先级(由高到低):.userInitiated—>.default—>.utility—>.background,一般最后一个就用于执行不太关心、极其费时的后台任务。

  • 创建串行队列:let serial = DispatchQueue(label: "serialQueue"),一个串行队列之中,任务是FIFO的,但是可以创建多个串行队列,而串行队列之间是并发的。
  • 创建并行队列(对于并发任务,一般就用系统提供的全局并行队列):let conflict = DispatchQueue(label: "conflictQueue", qos: .default, attributes: .concurrent, autoreleaseFrequency: .inherit, target: nil)
  • 全局并行队列:let globalQueue = DispatchQueue.global(qos: .default),qos就是优先级。

然后就是创建任务了:

同步任务:在任务执行时,线程的队列会等待执行完成后,才执行下一个任务,但是却可以追加新的任务(虽然没有立即执行:阻塞)

        let globalQueue = DispatchQueue.global(qos: .default)
globalQueue.sync {
addOne()
}

异步任务:不会阻塞当前线程

        let globalQueue = DispatchQueue.global(qos: .default)
globalQueue.async {
self.addOne()
}
let mainQueue = DispatchQueue.main
mainQueue.async {
self.addTwo() //主线程先执行
}

iOS多线程主题的更多相关文章

  1. 浅谈iOS多线程

    浅谈iOS多线程 首先,先看看进程和线程的概念. 图1.1 这一块不难理解,重点点下他们的几个重要区别: 1,地址空间和资源:进程可以申请和拥有系统资源,线程不行.资源进程间相互独立,同一进程的各线程 ...

  2. iOS多线程技术方案

    iOS多线程技术方案 目录 一.多线程简介 1.多线程的由来 2.耗时操作的模拟试验 3.进程和线程 4.多线程的概念及原理 5.多线程的优缺点和一个Tip 6.主线程 7.技术方案 二.Pthrea ...

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

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

  4. iOS多线程到底不安全在哪里?

    iOS多线程安全的概念在很多地方都会遇到,为什么不安全,不安全又该怎么去定义,其实是个值得深究的话题. 共享状态,多线程共同访问某个对象的property,在iOS编程里是很普遍的使用场景,我们就从P ...

  5. iOS多线程的详情使用示例--简进祥

    大家都知道,在开发过程中应该尽可能减少用户等待时间,让程序尽可能快的完成运算.可是无论是哪种语言开发的程序最终往往转换成汇编语言进而解释成机器码来执行.但是机器码是按顺序执行的,一个复杂的多步操作只能 ...

  6. iOS多线程

    关于iOS多线程 概述 这篇文章中,我不会说多线程是什么.线程和进程的区别.多线程有什么用,当然我也不会说什么是串行.什么是并行等问题,这些我们应该都知道的. 在 iOS 中其实目前有 4 套多线程方 ...

  7. iOS多线程学习及总结

    能有份网上的存储资料,备以后提升及参考 iOS 多线程编程 简介 一.      iOS有三种多线程编程的技术,分别是: 1.        NSThread 2.        Cocoa NSOp ...

  8. iOS多线程杂论

    iOS多线程的分布 (1) NSThread (2) NSOperation (3) GCD 现在对下面三个进行一个个的分析,希望那里说得不对的地方希望简友们帮我指点一二. 1,NSThread 优点 ...

  9. iOS多线程开发

    概览 大家都知道,在开发过程中应该尽可能减少用户等待时间,让程序尽可能快的完成运算.可是无论是哪种语言开发的程序最终往往转换成汇编语言进而解释成机器码来执行.但是机器码是按顺序执行的,一个复杂的多步操 ...

随机推荐

  1. 理清JavaScript正则表达式--下篇

    紧接:"理清JavaScript正则表达式--上篇". 正则在String类中的应用 类String支持四种利用正则表达式的方法.分别是search.replace.match和s ...

  2. 初步认识Node 之Web框架

    上一篇我们认识了Node是什么之后,这一篇我们主要了解的就是它的框架了.而它的框架又分为两大类,Web框架和全栈框架,接下来我们一个一个的来了解.    Web框架 Web框架可以细分为Web应用程序 ...

  3. CSS3与页面布局学习总结(二)——Box Model、边距折叠、内联与块标签、CSSReset

    一.盒子模型(Box Model) 盒子模型也有人称为框模型,HTML中的多数元素都会在浏览器中生成一个矩形的区域,每个区域包含四个组成部分,从外向内依次是:外边距(Margin).边框(Border ...

  4. 关于png、jpg、gif切图时的使用感悟

    关于png.jpg.gif切图时的使用感悟 曾经切图时都是一股脑所有图全切成jpg格式,最近突然心血来潮简单的研究了下其他图片格式的具体属性,才突然发现走了不少弯路,并没有做到使图片用最小体积展现出最 ...

  5. 实例讲解react+react-router+redux

    前言 总括: 本文采用react+redux+react-router+less+es6+webpack,以实现一个简易备忘录(todolist)为例尽可能全面的讲述使用react全家桶实现一个完整应 ...

  6. 【WCF】基于WCF的在线升级

    一.前言       前不久因公司产品需要完成了在线升级功能,因为编程技术不精,不敢冒然采用Socket方法实现在线升级,所以使用比较方便稳妥的WCF方式 如果考虑并发能力的话还是Socket> ...

  7. Button 模板和样式

    <Style TargetType="{x:Type Button}"> <Setter Property="FontFamily" Valu ...

  8. C#图片按比例缩放

    C#图片按比例缩放: // 按比例缩放图片 public Image ZoomPicture(Image SourceImage, int TargetWidth, int TargetHeight) ...

  9. spring mvc 和spring security配置 spring-servlet.xml和spring-security.xml设置

    spring-servlet.xml配置 <?xml version="1.0" encoding="UTF-8"?> <beans xmln ...

  10. 使用Maven私服的好处

    1.Maven仓库的分类 本地仓库:当Maven执行编译或测试时,如果需要使用到依赖文件,它总是基于坐标使用本地仓库的依赖文件.默认情况下,不管Linux还是Windows,每个用户在自己的用户目录下 ...