文章目录:
一、图示理解
二、各个角色
三、存在的挑战
一、图示理解
二、各个角色
1.程序员(创建任务)
代码就是任务
当一些任务需要在一条新线程而非当前线程执行时若程序员直接创建线程可能会引发的一个问题是,如果你的任务和所基于的框架任务都创建自己的线程时,那么活动的线程数量有可能以指数级增长。这会消耗大量资源,是不允许的
解决方案:使用GCD&operation queue
通过 GCD,开发者不用再直接跟线程打交道了,只需要向队列中添加代码块即可,GCD 在后端管理着一个线程池。GCD 不仅决定着你的代码块将在哪个线程被执行,它还根据可用的系统资源对这些线程进行管理。
2.GCD&operation queue(管理任务,安排任务)
以GCD为例:
程序员所需要做的就是按照GCD的规则(串行并行,同步异步)创建添加任务
可以将串行并行,同步异步理解为任务的属性
通过指定任务的串行并行,GCD判断如何分配任务即分配任务给哪个线程
通过指定任务的同步异步,GCD告诉将要执行该任务的线程如何处理新任务与其当前任务的关系
3.线程(执行任务)
执行任务的人(干活的)
4.RunLoop(为线程监测事件,事件发生时告诉线程执行事件触发的任务)
Runloop负责监测处理 UI 事件、计时器,以及其它内核相关事件。
无论开发者什么时候设置计时器、使用NSURLConnection或者调用performSelector:withObject:afterDelay:,其实背后都是 run loop 在处理这些异步事件。
5.资源(线程执行任务所需,如内存等)
6.Autoreleasepool(为线程清理执行任务后产生的垃圾)
Autoreleasepool工作原理:
RunLoop在线程执行完一次任务后销毁当前Autoreleasepool同时为线程创建一个新的Autoreleasepool以便线程下一次执行任务使用
Autoreleasepool被销毁会引起Autoreleasepool中所有的对象release从而释放内存
三、存在的挑战
资源共享,互斥锁,死锁,资源饥饿,优先级反转
四
操作队列提供了在 GCD 中不那么容易复制的有用特性。其中最重要的一个就是可以取消在任务处理队列中的任务,在稍后的例子中我们会看到这个。而且操作队列在管理操作间的依赖关系方面也容易一些。另一面,GCD 给予你更多的控制权力以及操作队列中所不能使用的底层函数。