OC多线程GCD以及NSoperation

首先讲一下关于线程的基础知识。网络

1.什么是进程?

进程是指在系统中正在运行的一个应用程序 每一个进程之间是独立的,每一个进程均运行在其专用且受保护的内存空间内。多线程

2.什么是线程?

1个进程要想执行任务,必须得有线程(每1个进程至少要有1条线程)线程是进程的基本执行单元,一个进程(程序)的全部任务都在线程中执行。并发

4.多线程的原理。

同一时间,CPU只能处理1条线程,只有1条线程在工做(执行)多线程并发(同时)执行,实际上是CPU快速地在多条线程之间调度(切换)若是CPU调度线程的时间足够快,就形成了多线程并发执行的假象思考:若是线程很是很是多,会发生什么状况?CPU会在N多线程之间调度,CPU会累死,消耗大量的CPU资源每条线程被调度执行的频次会下降(线程的执行效率下降)异步

4.多线程的优缺点。

多线程的优势 能适当提升程序的执行效率 能适当提升资源利用率(CPU、内存利用率)   多线程的缺点 开启线程须要占用必定的内存空间(默认状况下,主线程占用1M,子线程占用512KB),若是开启大量的线程,会占用大量的内存空间,下降程序的性能 线程越多,CPU在调度线程上的开销就越大 程序设计更加复杂:好比线程之间的通讯、多线程的数据共享函数

5.线程中的属性。

线程中有4个最主要的名词。性能

  • 同步任务:同步:在当前线程中执行任务,不具有开启新线程的能力。
  • 异步任务:在新的线程中执行任务,具有开启新线程的能力。 并发和串行决定了任务的执行方式
  • 并发队列:多个任务并发(同时)执行。
  • 串行队列:一个任务执行完毕后,再执行下一个任务。 而主队列是特殊的串行队列。 全局队列是特殊的并发队列。

6.GCD的基础使用。

1.串行队列。spa

  • 使用dispatch_queue_create函数建立串行队列

// 队列名称, 队列属性,通常用NULL便可 dispatch_queue_t  dispatch_queue_create(const char *label,  dispatch_queue_attr_t attr);线程

  • 使用 使用主队列(跟主线程相关联的队列)

主队列是GCD自带的一种特殊的串行队列,放在主队列中的任务,都会放到主线程中执行 使用dispatch_get_main_queue()得到主队列设计

2.并发队列。 GCD默认已经提供了全局的并发队列,供整个应用使用,不须要手动建立code

使用dispatch_get_global_queue函数得到全局的并发队列 // 此参数暂时无用,用0便可。

dispatch_queue_t dispatch_get_global_queue(dispatch_queue_priority_t priority,unsigned long flags);

GCD 小结:

其实多线程就是在多个线程之间快速作“切换”的操做(在线程调度池里执行任务)。 线程里有个属性是优先级。这个属性决定的是线程有更多的机会去调用。并非决定任务的前后顺序。 并且注意!!!!开发中 必定不要取修改优先级。不然会出现不少你想不到的错误。 不能把同步任务加入到主队列中。不然会出现同步锁现象。

7.NSoperation的基础使用。

  • 并发数 (1)并发数:同时执⾏行的任务数.好比,同时开3个线程执行3个任务,并发数就是3 (2)最大并发数:同一时间最多只能执行的任务的个数。 (3)最⼤大并发数的相关⽅方法
-(NSInteger)maxConcurrentOperationCount;- (void)setMaxConcurrentOperationCount:(NSInteger)cnt; 

说明:若是没有设置最大并发数,那么并发的个数是由系统内存和CPU决定的,可能内存多久开多一点,内存少就开少一点。 注意:num的值并不表明线程的个数,仅仅表明线程的ID。 提示:最大并发数不要乱写(5之内),不要开太多,通常以2~3为宜,由于虽然任务是在子线程进行处理的,可是cpu处理这些过多的子线程可能会影响UI,让UI变卡。

  • 队列的取消,暂停和恢复 1)取消队列的全部操做
- (void)cancelAllOperations;
提⽰:也能够调用NSOperation的- (void)cancel⽅法取消单个操做

(2)暂停和恢复队列

-(void)setSuspended:(BOOL)b; // YES表明暂停队列,NO表明恢复队列
-(BOOL)isSuspended; //当前状态

(3)暂停和恢复的适用场合:在tableview界面,开线程下载远程的网络界面,对UI会有影响,使用户体验变差。那么这种状况,就能够设置在用户操做UI(如滚动屏幕)的时候,暂停队列(不是取消队列),中止滚动的时候,恢复队列。

NSOperation 小结:

GCD和NSOperation 都各有各的好处。 GCD可以开多个线程 可是并不能管理。 可是NSOperation 能够管理线程。还能够设置最大操做并发数。 而GCD可使用延时方法 after 和sleep 还有一次性once方法 建立单例对象。 根据你所须要的去选择恰当的方法。

相关文章
相关标签/搜索