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

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

那么在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. busybox(二)编译

    title: busybox(二)编译 tag: arm date: 2018-11-13 23:14:58 --- busybox(二)编译 解压,源码包在busybox-1.7.0.tar.bz2 ...

  2. (转)如何阅读OpenStack源码

    1 关于该项目 本项目使用在线绘图工具web sequencediagrams完成,目标是图形化OpenStack的所有操作流程,通过操作序列图能快速学习Openstack的工作原理,理清各个组件的关 ...

  3. ubuntu14.04 网络配置

    流程分析: 在Ubuntu系统网络设备启动的流程中,会依赖/etc/network/interface的配置文件初始化网络接口,所以直接在/etc/network/interface之中配置好对应的d ...

  4. ruby 对象转换哈希(Hash)

    通过 ActiveRecord 从数据库的某张数据表(table)中获取的对象如何转换成为 Hash orders_table 是一张订单信息表,对应的 model 为 Orders @order = ...

  5. makefile $@, $^, $<, $? 表示的意义

    ref:https://www.cnblogs.com/gamesun/p/3323155.html $@  表示目标文件$^  表示所有的依赖文件$<  表示第一个依赖文件$?  表示比目标还 ...

  6. MySQL学习笔记(一)Ubuntu16.04中MySQL安装配置(5.6优化、错误日志、DNS解决)

    目录 第一部分.5.6安装.配置.自动备份 第二部分.5.7源码安装.配置.自动备份 第一部分.5.6安装 1.安装mysql sudo apt-get install mysql-server su ...

  7. Python 各种进制转换

    #coding=gbk var=input("请输入十六进制数:") b=bin(int(var,16)) print(b[2:]) 详细请参考python自带int函数.bin函 ...

  8. JaVa第二周学习总结

    第一周学习的时候上传图片用的是网站外链然后导致出现了极为尴尬的情形...然后我就把第一周的全改成本地上传了. 首先列出所做任务 1 安装IDEA 2学习二三章视频,课本 3调试代码,上传码云 4总结问 ...

  9. luoguo 1306 斐波那契公约数

    这题难度不大,主要是小结论:斐波那契第n项和第m项公约数就是第gcd(n,m)项 大概能猜出来,毕竟斐波那契数列反过来实在太像计算公约数的步骤了 日后填坑证明吧

  10. 使用IntelliJ IDEA 配置Maven(转)

    1. 下载Maven 官方地址:http://maven.apache.org/download.cgi 解压并新建一个本地仓库文件夹 2.配置本地仓库路径 3.配置maven环境变量 4.在Inte ...