最近又看了下官方关于并发编程的文档,简单做一下总结。
并发和程序设计
并发编程的几个概念:
-
并发:并发表示同时发生多件事情的概念
并行:并行是多个任务同时发生并且同时运行直到结束
-
同步:同步指函数运行时会阻塞当前线程一直运行结束
异步:异步指函数运行时不会阻塞当前线程
-
串行:当前队列中的任务是顺序执行的
并行: 当前队列中的任务是并发执行的,没有特定的顺序
-
并发的优点和缺点
优点:
• 充分发挥多核处理器优势,将不同线程任务分配给不同的处理器,真正进入“并行运算”状态
• 将耗时的任务分配到其他线程执行,由主线程负责统一更新界面会使应用程序更加流畅,用户体验更好
• 当硬件处理器的数量增加,程序会运行更快,而程序无需做任何调整
缺点:
增加了开销,并增加了整体的代码的复杂性,使得代码更难编写和调试
使用并发编程之前,你应该分解出可执行的工作单元,并确定你需要的队列。
Operation Queues
NSOperation是一个面向对象的方式来封装要异步执行的工作,被设计成结合操作队列(NSOperationQueue)使用,也可以自己单独使用
子类:
Target/Action 方式初始化
|
|
Block方式初始化
|
|
所有的NSOperation对象支持以下特性:
1.设置依赖关系
2.设置完成块
3.使用KVO通知监听你的Operations执行状态改变
4.设置优先级
5.取消操作
自定义Operation(默认start为非并发)
1.继承NSOperation基类
2.至少实现下面两个方法:
initialization
main
3.其他可添加的方法
自定义的在主函数调用的方法
数据的存取方法
NSCoding协议的方法
并发执行的配置操作
1.重写isConcurrent函数并返回YES
2.重写start函数
3.重写isExecuting和isFinished函数
NSOperation属性列表
isCancelled 是否取消
isConcurrent 是否并发
isExecuting 是否正在执行
isFinished 是否已经完成
isReady 是否准备好要执行
dependencies(array) 依赖关系数组
queuePriority 优先级
completionBlock 完成块
优先级:
|
|
Dispatch Queues
串行队列(创建一个线程)
|
|
并发队列(创建多个线程)
|
|
主队列
|
|
后台队列
|
|
异步执行
|
|
同步执行(不会开辟新的线程)
|
|
以上可能有四种组合方式:
dispatch_sync + 串行队列 (串行执行)
dispatch_sync + 并发队列 (串行执行)
dispatch_async + 串行队列 (串行执行)
dispatch_async + 并发队列 (并行执行)
Dispatch Group
将多个任务放到这个组里面,可以在所有的任务都结束后得到一个回调。
dispatch_barrier_async + dispatch_queue_create()
使用时需要自己创建并发队列,不能使用后台队列。
dispatch_apply
和dispatch_sync一样,是同步运行的,会阻塞当前线程。
Dispatch Semaphore
可以根据自己需要创建需要的signal数量,如果只创建一个则为串行执行。
注意
循环引用
死锁
相关demo