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

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

那么在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. 强化学习Q-Learning算法详解

    python风控评分卡建模和风控常识(博客主亲自录制视频教程) https://study.163.com/course/introduction.htm?courseId=1005214003&am ...

  2. 查看weblogic版本号

    通过WebLogic配置文件config.xml,示例如下: # cat config.xml|grep version

  3. [物理学与PDEs]第1章第7节 媒质中的 Maxwell 方程组 7.3 媒质中电磁场量的表示

    1. 电磁能量密度 $$\bex \cfrac{1}{2}({\bf E}\cdot{\bf D}+{\bf B}\cdot{\bf H}). \eex$$ 2. 电磁能量流密度向量 $$\bex { ...

  4. js打印WEB页面内容代码大全

    第一种方法:指定不打印区域 使用CSS,定义一个.noprint的class,将不打印的内容放入这个class内. 详细如下: <style media=print type="tex ...

  5. L1-Day4

    L1-Day4 1.这消息使她非常悲伤. [我的翻译]The message makes she very sad. [标准答案]The news made her very sad. [对比分析]( ...

  6. Linux找回root密码

    Linux忘记root密码时,密码重置步骤: 1.将虚拟机重启: 2.当进入GRUB倒计时界面,点击键盘e键: 3.点击键盘上下键选择第二行(kernel /vmlinuz-2.6.32-71.29. ...

  7. SQL Server - case when...then...else...end

    Case具有两种格式.简单Case函数和Case搜索函数. --简单Case函数 CASE sex ' THEN '男' ' THEN '女' ELSE '其他' END --Case搜索函数 ' T ...

  8. Idea 问题记录

    日常问题记录 下载IDEA, tomcat ,下载jdk 前言:java net对比 Java:JDK  .NET:.NetFramework WEB服务器 Java:Tomcat,JBoss,Web ...

  9. java应用的优化【转】

    XX银行网银系统是一套全新的对公业务渠道类系统,经过两年的建设,将逐步对外提供服务. 该系统融合了原来多个对公渠道系统,并发量是以前多个系统之和,吞吐量要求将大幅上升.为了使广大对公客户使用系统时获得 ...

  10. html-webpack-template, 一个更好的html web service插件

    源代码名称:html-webpack-template 源代码网址:http://www.github.com/jaketrent/html-webpack-template html-webpack ...