标签:
1. iOS中苹果提供4钟方案来帮助我们实现多线程:
(1) 纯C语言的pthread,偏底层,需要程序员手动管理线程的生命周期,基本不用。
(2) OC语言的NSTread,需要手动管理线程生命周期,偶尔调试用来获取当前线程[NSTread currentTread/mainTread];
(3) 纯C语言的GCD(Grand Central Dispatch伟大的中枢调度器),自动管理线程生命周期,完全隐藏了Tread字眼,面向任务和队列,有同步和异步函数,自动决定开启的线程数量,自动管理线程的生死,虽然是C语言的,但是经常使用。
(4) OC语言的NSOperation,底层封装了GCD,自动管理线程生命周期,比GCD多了一些功能,因为是OC的,更加面向对象,经常使用。
2. GCD相关总结:
2.1 在iOS中同时开线程最好不要超过5条,GCD也是这么操作的。可以在主线程利用GCD开启10条线程,然后在block中打印每条线程,发现主队列中最多5条线程同一时间执行。GCD会根据当前设备CPU的内核数(单核、双核、四核)自动决定开启线程数的多少。
2.2 GCD屏蔽了线程,程序员无需关注dispath什么时候开启线程,什么时候执行任务,什么时候关闭线程。GCD面向任务和队列,使用GCD函数时只需要告诉它任务(写在block中)和队列名(queue)这两个参数,GCD会自动将任务加入到该队列中,然后按照队列的先进先出FIFO原则,取出任务,开启线程,在线程中完成任务。GCD只是在线程中默默地把任务做完,做完了它不会反馈任何提示信息。
2.3 常用的2个最简单的GCD函数:
dispatch_sync(dispatch_queue_t queue, ^(void)block); //sync同步,只能在当前线程(通常是主线程/UI线程)中并发/串行执行queue中的任务block,不能开启新的线程来执行队列中的任务。
dispatch_async(dispatch_queue_t queue, ^(void)block); //async异步,能够开启多条线程(一般最多5条)并发/串行的执行queue中的block任务。
2.4 关于串行和并发:
这两个概念是针对queue队列来说的,在每个线程中都会有一个主队列,也可以自己新建多条队列,在使用dispatch函数时,传入的参数为queue名和block,那么该block就会被加入该queue中等待执行。串行队列是指一次只能取出queue中的一个任务执行,前面的没执行完,后面的就不可能被执行。而并发队列是一次可以取出queue中的多个任务,开多条线程同时执行。后面的任务可能和前面的任务同时被执行完成。并发队列只能在异步GCD函数dispatch_async中执行。
2.5 易混淆的术语:
同步/异步针对GCD函数而言,主要影响能不能开启多条线程;串行和并发针对队列queue而言,主要影响任务的执行方法。
同步:GCD函数只能在当前线程执行,不能开启新线程 。
异步:GCD函数可以开启多条线程执行queue中的任务。
串行:queue中一次只能取出一个任务,执行完了才能执行下一个。
并发:queue中可以一次取出多个任务,在多条线程中同时执行。
2.6 GCD最常见的用法:全局并发队列异步执行任务
GCD会自动帮我们创建一个整个程序都能访问的全局并发队列,我们在程序的任何地方获取它(),然后利用GCD异步函数dispatch_async将任务添加其中,有GCD自动在后台开启线程并发执行。
2.7 main_queue和global_queue区别
NSLog(@"main: %@, global:%@",dispatch_get_main_queue(),dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0));
//队列优先级有:DEFAULT/HIGH/LOW等,一般用DEFAULT。 0是一个预留参数。
打印结果:
main: <OS_dispatch_queue: com.apple.main-thread[0x10fb229c0]>,
global:<OS_dispatch_queue_root: com.apple.root.default-qos[0x10fb23240]>
标签:
原文地址:http://www.cnblogs.com/stevenwuzheng/p/5490122.html