多线程:
一、概念

1、什么是进程?

    程序的一次性执行就是进程。进程占独立的内存空间。
 
2、什么是线程?
    进程中的代码的执行路径。
 
3、进程与线程之间的关系?
     每个进程都要创建一个线程,叫主线程。主线程是其他所有线程的父线程。多个线程共享进程之间的内存空间。
 
4、单核与多核处理器下多线程的不同?
     单核处理器:一个cpu是分时间片轮流执行不同的线程,在切换线程时需要保存和恢复系线程的上下文(cpu中寄存器的内容)。
     多核处理器:多个cpu可以同时执行不同的线程。
 
5、多线程中线程同步的问题?
     多个线程对同一资源出现竞争的情况下会出现线程同步的问题。
     解决办法:加锁lock、条件condition、信号量semaphore(生产者消费者问题)
 

二、3种多线程技术对比

1.NSThread
2.NSOperation
3.GCD —— Grand Central Dispatch,是基于C语言的框架

以上这三种编程方式从上到下,抽象度层次是从低到高的,抽象度越高的使用越简单,也是Apple最推荐使用的。但是就目前而言,iOS的开发者,需要了解三种多线程技术的基本使用过程。因为很多框架技术分别使用了不同多线程技术。例如NSURLConnection的异步静态方法:sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *error)

•NSThread:
优点:NSThread 比其他两个轻量级,使用简单
缺点:需要自己管理线程的生命周期、线程同步。线程同步对数据的加锁会有一定的系统开销
•NSOperation:
不需要关心线程管理,数据同步的事情,可以把精力放在自己需要执行的操作上
•GCD:
Grand Central Dispatch是由苹果开发的一个多核编程的解决方案。iOS4.0+才能使用,是替代NSThread, NSOperation的高效和强大的技术,用途广泛,苹果公司极力推崇的一个框架。
     

三、创建线程的主要3种方式

       创建线程方法:
1.+ (void)detachNewThreadSelector:(SEL)selector toTarget:(id)target withObject:(id)argument;
2.- (id)initWithTarget:(id)target selector:(SEL)selector object:(id)argument;
3.继承NSThread类,然后在子类中重写父类的执行线程的main方法。
 
•参数说明:
selector:线程执行的方法,只能有一个参数,不能有返回值
target:selector消息发送的对象
argument:传输给target的唯一参数,也可以是nil
•NSObject直接加入了多线程的支持,允许对象的某个方法在后台运行(本方法普遍应用在游戏中,利用多线程播放声音)
 - (void)performSelectorInBackground:(SEL)aSelector withObject:(id)arg;
 

四、NSThread的使用

•当涉及到共享资源争夺时,共享资源的数据加锁是一个难点,既要保证数据安全,又要保证线程执行效率
–使用前加锁
–尽快使用
–使用完解锁
–再去做其他的事情
•多线程编写顺序
1.单个方法调试OK
2.单个线程调试OK
3.增加线程,并考虑线程加锁、解锁的准确位置。
•注意:
–只有主线程能够修改UI
–如果不涉及到内存争抢,NSThread写多线程是最简单的
•当不涉及共享资源争夺时,使用NSObject的performSelectorInBackground方法可以非常的方便地实现多线程
 

五、 NSOperation & NSOperationQueue的使用

•NSOperation的两个子类
1.NSInvocationOperation
2.NSBlockOperation
3.子类化NSOperation,然后重写main方法
•工作原理:
1.用NSOperation封装要执行的操作
2.将创建好的NSOperation对象放NSOperationQueue中
3.启动OperationQueue开始新的线程执行队列中的操作
•注意事项:
1.使用多线程时通常需要控制线程的并发数,因为线程会消耗系统资源,同时运行的线程过多,系统会变慢
2.使用以下方法可以控制并发的线程数量:

- (void)setMaxConcurrentOperationCount:(NSInteger)cnt

•使用小结:

•NSOperation中无需使用线程锁

•除更新UI之外,对共享资源的争夺也需放在主线程队列之中

•将定义的操作添加至队列之后,多线程便开始启动

•NSBlockOperation的使用相比NSInvocationOperation更加灵活、方便

•通过setMaxConcurrentOperationCount方法可以控制并发的最大线程数量

六、GCD的使用

•GCD是基于C语言的框架
•工作原理:
–让程序平行排队的特定任务,根据可用的处理资源,安排它们在任何可用的处理器上执行任务
–要执行的任务可以是一个函数或者一个block
–底层是通过线程实现的,不过程序员可以不必关注实现的细节
–GCD中的FIFO队列称为dispatch queue,可以保证先进来的任务先得到执行
–dispatch__notify可以实现监听一组任务是否完成,完成后得到通知
•dispatch queue:
1.Main dispatch queue:是全局可用的队列,用于在主线程上执行任务
2.Serial:同时只执行一个任务
3.Concurrent:可以并发地执行多个任务,但是执行完成的顺序是随机的
 
•使用小结:
•GCD的原理和Operation非常相像,只是它是C语言架构的。
•GCD中无需使用线程锁
•除更新UI之外,对共享资源的争夺也需放在主调度队列之中
•将任务添加至群组,并指定全局操作队列,使得GCD的多线程更加灵活、方便
•dispatch_group_notify可以监听一组任务是否完成。这个方法很有用,比如你执行三个下载任务,当三个任务都下载完成后,才通知界面说已经完成
•如果不需要监听一组任务,可以直接使用dispatch_async方法

最后建议:

•关于多线程必须记住的三个要点
–只能在主线程中更新UI
–共享数据争夺的处理
–不要使用多种多线程技术去争夺同一个资源!
•在使用多线程的时候,是为了处理并发操作的。如果有可能,我们不要去做抢资源的事情!
 

iOS:多线程的详细介绍的更多相关文章

  1. iOS多线程各种安全锁介绍 - 线程同步

    一.atomic介绍 github对应Demo:https://github.com/Master-fd/LockDemo 在iOS中,@property 新增属性时,可以增加atomic选项,ato ...

  2. iOS——多线程编程详细解析

    基本定义: 程序:由代码生成的可执行应用.(例如QQ.app) 进程:一个正在运行的程序可以看做是一个进程. (例如:正在运行的QQ 就是一个进程),进程拥有独立运行所需要的全部资源. 线程: 程序中 ...

  3. iOS UICollectionview的详细介绍

    转载自:http://jinqianchina.github.io/2015/08/16/UICollectionview%E7%9A%84%E4%BD%BF%E7%94%A8%E8%AF%A6%E8 ...

  4. iOS开发多线程篇—GCD介绍

    iOS开发多线程篇—GCD介绍 一.简单介绍 1.什么是GCD? 全称是Grand Central Dispatch,可译为“牛逼的中枢调度器” 纯C语言,提供了非常多强大的函数 2.GCD的优势 G ...

  5. 学习笔记:APP切图那点事儿–详细介绍android和ios平台

    学习笔记:APP切图那点事儿–详细介绍android和ios平台 转载自:http://www.woofeng.cn/articles/168.html   版权归原作者所有 作者:亚茹有李 原文地址 ...

  6. iOS开发——实用OC篇&多种定时器详细介绍

    多种定时器详细介绍   在软件开发过程中,我们常常需要在某个时间后执行某个方法,或者是按照某个周期一直执行某个方法.在这个时候,我们就需要用到定时器. 然而,在iOS中有很多方法完成以上的任务,到底有 ...

  7. ios开发——实用技术篇&Pist转模型详细介绍

    Pist转模型详细介绍 关于Plist转模型在iOS开发中是非常常见的,每开一一个项目或者实现一个功能都要用到它,所以今天就给大家讲讲Plist怎么转成模型数据, 前提:必须有一个Plist文件或者通 ...

  8. [转] iOS多线程编程之Grand Central Dispatch(GCD)介绍和使用

    介绍: Grand Central Dispatch 简称(GCD)是苹果公司开发的技术,以优化的应用程序支持多核心处理器和其他的对称多处理系统的系统.这建立在任务并行执行的线程池模式的基础上的.它首 ...

  9. 城市经纬度 json 理解SignalR Main(string[] args)之args传递的几种方式 串口编程之端口 多线程详细介绍 递归一个List<T>,可自己根据需要改造为通用型。 Sql 优化解决方案

    城市经纬度 json https://www.cnblogs.com/innershare/p/10723968.html 理解SignalR ASP .NET SignalR 是一个ASP .NET ...

随机推荐

  1. leetcode 之Rotate Image(8)

    这题需要搞清楚矩阵元素的位置关系,尤其是副对角线元素,沿着副对角线元素 void rotateImage(vector<vector<int>> &matrix) { ...

  2. 20:django中的安全问题

    本节主要是讲解django中的安全特性,讲述django是如何应对网站一般面临的安全性问题 跨站点脚本(XXS)攻击 跨站点脚本攻击是指一个用户把客户端脚本注入到其他用户的浏览器中.通常是通过在数据库 ...

  3. Java AQS学习

    参考原文: Java并发之AQS详解 <Java并发编程的艺术> AQS 概述 AQS简介 AQS(AbstractQueuedSynchronizer)就是一个抽象的队列同步器,它是用来 ...

  4. NativeScriptEngineService 被调用流程

    AbsractSearchScritp 有个lookup! NativeScriptEngineService search()会调用 script.setLookup() NativeScriptE ...

  5. yum -y install 和yum install 的区别

    yum -y install 包名(支持*) :自动选择y,全自动 yum install 包名(支持*) :手动选择y or n yum remove 包名(不支持*) rpm -ivh 包名(支持 ...

  6. 寻找与网页内容相关的图片(三)网易新闻与qq空间的做法

    寻找与网页相关的图片现在看来无非有两种方式,第一种是网页自己指定,第二种是通过算法推断. 对于网站的内容提供者来说,他自己知道相关的图片在哪,正如前文所述可以在HTML的头部加上META标签,也可以像 ...

  7. tomcat放置静态html页面

    因公司tomcat网站需要部署一个html的静态网页上去 在项目目录下建立了一个 /usr/local/tomcat/apache-tomcat-brain-api/webapps/ROOT/html ...

  8. 洛谷——P1177 【模板】快速排序

    P1177 [模板]快速排序. 题目描述 利用快速排序算法将读入的N个数从小到大排序后输出. 快速排序是信息学竞赛的必备算法之一.对于快速排序不是很了解的同学可以自行上网查询相关资料,掌握后独立完成. ...

  9. RHEL/CentOS网络相关的配置文件路径

    /etc/sysconfig/network-scripts/ifcfg-ens33 //IP地址,子网掩码等配置文件 /etc/sysconfig/network-scripts/ifcfg-lo ...

  10. UGUI的优点新UI系统二 直观、易于使用

    UGUI的优点新UI系统二 直观.易于使用   对于UI控件,开发者可以直接使用鼠标在Scene视图里编辑它们的大小.位置和旋转角度,而无需编写任何代码,以Button为例,如图1-3.图1-4和图1 ...