网站大量收购独家精品文档,联系QQ:2885784924

iOS开发中多线程的那些事.docx

  1. 1、本文档共15页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
iOS开发中多线程的那些事

iOS开发入门之后终究是要接触多线程和runloop的,本片文章就简单讲下iOS开发中的多线程技术。线程、进程什么是线程、进程有的人说进程就像是人的脑袋,线程就是脑袋上的头发(谁这么说的?打死他!)。其实这么比方不算错,但是更简单的来说,用迅雷下载文件,迅雷这个程序就是一个进程,下载的文件就是一个线程,同时下载三个文件就是多线程。一个进程可以只包含一个线程去处理事务,也可以有多个线程。多线程的优点和缺点多线程可以大大提高软件的执行效率和资源(CPU、内存)利用率,因为CPU只可以处理一个线程(多核CPU另说),而多线程可以让CPU同时处理多个任务(其实CPU同一时间还是只处理一个线程,但是如果切换的够快,就可以了认为同时处理多个任务)。但是多线程也有缺点:当线程过多,会消耗大量的CPU资源,而且,每开一条线程也是需要耗费资源的(iOS主线程占用1M内存空间,子线程占用512KB)。iOS开发中的多线程iOS程序在启动后会自动开启一个线程,称为?主线程?或者?UI线程?,用来显示、刷新UI界面,处理点击、滚动等事件,所以耗费时间的事件(比如网络、磁盘操作)尽量不要放在主线程,否则会阻塞主线程造成界面卡顿。iOS开发中的多线程实现方案有四种:技术方案简介语言生命周期管理pthread一套通用的多线程API,适用于Unix\Linux\Windows等系统,跨平台\可移植,使用难度大C程序员管理NSThread使用更加面向对象,简单易用,可直接操作线程对象Objective-C程序员手动实例化GCD旨在替代NSThread等线程技术,充分利用设备的多核C自动管理NSOperation基于GCD(底层是GCD),比GCD多了一些更简单实用的功能,使用更加面向对象Objective-C自动管理多线程中GCD我使用比较多,以GCD为例,多线程有两个核心概念:任务 (做什么?)队列 (存放任务,怎么做?)任务就是你开辟多线程要来做什么?而每个线程都是要加到一个队列中去的,队列决定任务用什么方式来执行。线程执行任务方式分为:异步执行同步执行同步执行只能在当前线程执行,不能开辟新的线程。而且是必须、立即执行。而异步执行可以开辟新的线程。队列分为:并发队列串行队列并发队列可以让多个线程同时执行(必须是异步),串行队列则是让任务一个接一个的执行。打个比方说,串行队列就是单车道,再多的车也得一个一个的跑(--:我俩车强行并着跑不行? --:来人,拖出去砍了!),而串行是多车道,可以几辆车同时并着跑。那么到底是几车道?并发队列有个最大并发数,一般可以手动设置。那么,线程加入到队列中,到底会怎么执行?并发队列串行队列(非主队列)主队列(只有主线程,串行队列)同步不开启新的线程,串行不开启新的线程,串行不开启新的线程,串行异步开启新的线程,并发开启新的线程,串行不开启新的线程,串行注意:只用在并发队列异步执行才会开启新的线程并发执行;在当前串行队列中开启一个同步线程会造成?线程阻塞?,因为上文说过,同步线程需要立即马上执行,当在当前串行队列中创建同步线程时需要在串行队列立即执行任务,而此时线程还需要向下继续执行任务,造成阻塞。上面提到线程会阻塞,那么什么是阻塞?除了阻塞之外线程还有其他什么状态?一般来说,线程有五个状态:新建状态:线程刚刚被创建,还没有调用?run?方法,这个时候的线程就是新建状态;就绪状态:在新建线程被创建之后调用了?run?方法,但是CPU并不是真正的同时执行多个任务,所以要等待CPU调用,这个时候线程处于就绪状态,随时可能进入下一个状态;运行状态:在线程执行过?run方法之后,CPU已经调度该线程即线程获取了CPU时间;阻塞状态:线程在运行时可能会进入阻塞状态,比如线程睡眠(sleep);希望得到一个锁,但是该锁正被其他线程拥有。。死亡状态:当线程执行完任务或者因为异常情况提前终止了线程iOS开发中的多线程的使用pthread的使用使用下面代码可以创建一个线程:int pthread_create(pthread_t * __restrict, const pthread_attr_t * __restrict,void *(*)(void *), void * __restrict)可以看到这个方法有四个参数,主要参数有 **pthread_t * __restrict** ,因为该方法是C语言,所以这个参数不是一个对象,而是一个?pthread_t?的地址,还有 **void?()(void *)** 是一个无返回值的函数指针。使用代码:void * run(void *param){ NSLog(@currentThread--%@, [NSThread currentThread]); return NULL;}-

文档评论(0)

xcs88858 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

版权声明书
用户编号:8130065136000003

1亿VIP精品文档

相关文档