首先要知道线程和进程的区别。一个系统上运行的每一个应用程序都是一个线程。而进程中要执行的任务都是在线程上来实现的,所以说线程是进程的最小执行单元。

进程最少要有一个线程。多线程,顾名思义就是多条线程。

那么在ios开发中运用到的多线程都有哪些呢,都有什么区别的,下面我们就来详细的吐槽一波。

说到多线程不得不提到POSix threads,简称PThreads。他是类Unix操作系统中管理线程的一套完整的API。具体的PThreads自己问一下性感迷人的度娘娘嘞!而Ios开发中我们碰到的线程管理具体的有3类,分别是:NSThreadNSOperation(NSOperationQueue)and GCD

一、NSThread

NSthread我们在开发中用的最多的就是用【NSThread  CurrentThread】来获取当前的线程。他在执行一些比较简单的单任务的时候还是比较好用的,但是当要执行多个任务,并且任务之间还存在一定的关联,有执行先后顺序,这时候NSThread就显得太薄弱了。

二、GCD

开发过程中我们用的最多的就是GCD了吧。他是基于C语言的一套多线程开发的API。使用起来很方便,我们不用管理线程的生命周期,只需要关注我们执行的任务以及任务之间的关联就可以了,GCD帮我们管理线程的生命周期。GCD归纳起来就是 队列 + 执行方式。也就是说我们需要把执行的任务放到队列中,然后以何种方式执行即可。

至于队列,GCD为我们提供了两种队列:串行队列和并行队列,这里需要提到的是程序中已经存在的两个特殊的队列,他们分别是主队列(程序为我们创建的一个串行队列)和全局队列(程序为我们创建的一个并行队列)

串行队列:串行队列,就是说在这个队列上的任务必须是一个接一个执行的,必须等待前面的一个任务执行完毕才可以继续执行下面的任务。而且串行队列不具备开启新线程的能力。

并行队列:并行队列,就是说在这个队列上的任务不用等前面的任务执行完毕就可以执行其他的任务,他是等待任务执行的时候并发执行多个任务。而且并行队列具备开启新线程的能力,但是他不一定一定开启一个新的线程来执行任务,主要还是看CPU的调度。

同步执行:必须等dispatch_sync() 函数中的blcok执行完毕才返回该函数,同时同步执行也不能开辟新的线程。

异步执行:dispatch_async() 函数立刻返回,不用等里面的block执行完毕,可以理解为在下一个执行周期执行block中的任务。异步执行可以开启新的线程,但是不一定一定开启新的线程。

下面说一下队列和执行方式的几种组合方式。

1.串行队列 + 同步执行(这里的串行队列不能是主队列,因为会死锁)

我们可以看到任务是按顺序执行的。

2.串行队列 + 异步执行

我们可以看到异步执行的时候dispatch_async() 函数并没用等block执行完毕就继续执行下面的任务了。在下一个执行周期的时候执行了block中的任务。

3.并行队列 + 同步执行

任务仍然是按顺序执行的。同步执行必须等block中的任务执行完毕才返回dispatch函数,然后才执行下面的任务

4.并行队列 + 异步执行

任务没有按顺序执行。

      GCD其他方面的功能       

      1. dispatch_after

      这个函数是用来延时执行任务用的

可以看出在主队列中延时执行,那么任务是在主线程中执行的。如果在全局队列上延时执行,那么任务是在子线程中执行的。如果是在自定义的队列上执行,那么任务也是在子线程上执行的。

2. dispatch_once

这个函数就是只执行一次,在程序中用的最多的估计就是创建单例类的时候吧。

我们可以看到程序调用了3次,但是dispatch_once只执行了一次。

3. dispatch_group_async && dispatch_group_notify

dispatch_group主要就是当任务执行有顺序的时候可以用到,假如有3个任务,A,B,C,现在想要实现A,B执行完毕之后再执行C。如下:

当任务A和B执行完毕之后执行C。完美解决。

4.dispatch_barrier_async

这个函数我们称之为栅栏函数,用这个函数添加任务的时候,会查找当前队列中是否有在此任务之前添加的其他任务没有执行完毕,如果有,那么等待其他任务执行完毕再执行这个任务,同时在这个任务后面添加的任务必须等待这个栅栏函数任务执行完毕之后才能执行。

case1

case2

case3

case4

5.dispatch_apply

这个函数主要用来重复执行任务,该函数是一个同步函数,所以要注意在用的时候不能把任务添加到主线程中避免造成死锁。

      三、NSOperation 

NSOperation是一个抽象类,我们可以理解为任务,我们一般不直接使用他,而是用他的两个子类NSBlockOperationNSInvocationOperation,或者我们自定义她的子类,下面我们就这几种用法详细讨论。

      1.自定义子类。

自定义子类,我们需要做的就是在子类中重写父类的main方法,把自己的任务添加到main方法中然后 调用start方法执行任务即可。后面会说到NSOperationmQueue,他是用来管理任务的,我们等会再说。

      2.NSBlockOperation

      3.NSInvocationOperation

 

4.NSOperationQueue

operation创建好之后我们可以通过调用operation 的 start 方法来执行任务。而OperationQueue可以帮我们省去这些麻烦,我们创建好任务operation后直接把operation添加到queue中就可以了,queue帮我们管理任务的执行。queue中的任务是异步并发执行的。

IOS中多线程的总结的更多相关文章

  1. iOS中多线程知识总结(一)

    这一段开发中一直在处理iOS多线程的问题,但是感觉知识太散了,所以就把iOS中多线程的知识点总结了一下. 1.基本概念 1)什么是进程?进程的特性是什么? 进程是指在系统中正在运行的一个应用程序.   ...

  2. iOS中多线程原理与runloop介绍

    一.线程概述 有些程序是一条直线,起点到终点:有些程序是一个圆,不断循环,直到将它切断.直线的如简单的Hello World,运行打印完,它的生命周期便结束了,像昙花一现那样:圆如操作系统,一直运行直 ...

  3. iOS 中多线程的简单使用

    iOS中常用的多线程操作有( NSThread, NSOperation GCD ) 为了能更直观的展现多线程操作在SB中做如下的界面布局: 当点击下载的时候从网络上下载图片: - (void)loa ...

  4. iOS中多线程的实现方案

    什么是主线程? 一个iOS程序运行后,默认会开启一条线程,称为“主线程”或“UI线程” 主线程的主要作用 1.显示/刷新UI界面 2.处理UI事件(比如点击事件,滚动事件,拖拽事件) 主线程的使用注意 ...

  5. iOS中多线程常用的知识点

        1.pThread 跨平台的多线程技术 , 是IEEE制定的POSIX 表示可移植性操作系统接口的多线程计数,UNIX内核平台 Unix,Linux,Mac(小红帽) (windows上有可移 ...

  6. iOS中多线程知识总结(二)

    1.GCD GCD全称是Grand Central Dispatch,译为"强大的中枢管理器" 1)什么是任务?什么是队列? 任务和队列是GCD的核心. 任务: 执行什么操作 队列 ...

  7. ios中多线程GCD NSOperation NSThread 相关的操作解析

    //1.GCD 继承自C语言 优点 简单方便 //开启一个子线程处理耗时的操作 dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIO ...

  8. OS X 和iOS 中的多线程技术(上)

    OS X 和iOS 中的多线程技术(上) 本文梳理了OS X 和iOS 系统中提供的多线程技术.并且对这些技术的使用给出了一些实用的建议. 多线程的目的:通过并发执行提高 CPU 的使用效率,进而提供 ...

  9. iOS中的几种锁的总结,三种开启多线程的方式(GCD、NSOperation、NSThread)

    学习内容 欢迎关注我的iOS学习总结--每天学一点iOS:https://github.com/practiceqian/one-day-one-iOS-summary OC中的几种锁 为什么要引入锁 ...

随机推荐

  1. [再寄小读者之数学篇](2014-06-22 求导数 [中国科学技术大学2014年高等数学B考研试题])

    设 $f(x)=x^2\ln(x+1)$, 求 $f^{(n)}(0)$. 解答: 利用 Leibniz 公式易知 $f'(0)=f''(0)=0$, $f^{(n)}(0)=(-1)^{n-3} n ...

  2. SSH框架之hibernate《四》

    hibernate第四天     一.JPA相关概念         1.1JPA概述             全称是:Java Persistence API.是sun公司推出的一套基于ORM的规范 ...

  3. 四十九、进程间通信——System V IPC 之消息队列

    49.1 System V IPC 介绍 49.1.1 System V IPC 概述 UNIX 系统存在信号.管道和命名管道等基本进程间通讯机制 System V 引入了三种高级进程间通信机制 消息 ...

  4. Nginx--服务部署、基于域名的虚拟主机配置

    一.服务部署 1.预处理 安装CentOS ,配置hosts.静态IP.设置必要的安全参数等(略) 1-1.系统环境 [root@vnx ~]# cat /etc/redhat-release Cen ...

  5. Linux内核 设备树操作常用API【转】

    转自:https://www.linuxidc.com/Linux/2017-02/140818.htm 一文中介绍了设备树的语法,这里主要介绍内核中提供的操作设备树的API,这些API通常都在&qu ...

  6. IIS 一键安装及卸载

    IIS6:适用于win server 2003:: ******************* :: * 安装 :: ******************* :Install Cls @echo. &am ...

  7. 51nod--1135 原根 (数论)

    题目: 设m是正整数,a是整数,若a模m的阶等于φ(m),则称a为模m的一个原根.(其中φ(m)表示m的欧拉函数) 给出1个质数P,找出P最小的原根. Input 输入1个质数P(3 <= P ...

  8. 【原创】运维基础之Docker(3)搭建私有仓库

    下载并启动registry $ docker pull registry$ docker run --name my_registry -d -p 5000:5000 -v /var/lib/regi ...

  9. thinkpad 睡眠唤醒后热键功能正常,但屏幕无法显示状态/进度条/图标

    由于博主比较习惯笔记本开盖即用,合盖即走,不大习惯开机关机(毕竟SSD速度杠杠滴^_^).可是发现笔记本长时间睡眠乃至休眠唤醒后,使用thinkpad热键,虽然可以调节,但屏幕不显示调节状态了.解决步 ...

  10. SSH阅读笔记

    1.SSH单阶人脸段检测器,在不同层检测不同scale的人脸,而不是使用mtcnn中金字塔的方式,从而实现加速. 2.SSH的整体结构,3个module的stride分别为8,16,32,使用不同的感 ...