文章目錄:
一、圖示理解
二、各個(gè)角色
三、存在的挑戰(zhàn)
一、圖示理解

二、各個(gè)角色
1.程序員(創(chuàng)建任務(wù))
代碼就是任務(wù)
當(dāng)一些任務(wù)需要在一條新線程而非當(dāng)前線程執(zhí)行時(shí)若程序員直接創(chuàng)建線程可能會(huì)引發(fā)的一個(gè)問題是,如果你的任務(wù)和所基于的框架任務(wù)都創(chuàng)建自己的線程時(shí),那么活動(dòng)的線程數(shù)量有可能以指數(shù)級(jí)增長(zhǎng)。這會(huì)消耗大量資源,是不允許的
解決方案:使用GCD&operation queue
通過 GCD,開發(fā)者不用再直接跟線程打交道了,只需要向隊(duì)列中添加代碼塊即可,GCD 在后端管理著一個(gè)線程池。GCD 不僅決定著你的代碼塊將在哪個(gè)線程被執(zhí)行,它還根據(jù)可用的系統(tǒng)資源對(duì)這些線程進(jìn)行管理。
2.GCD&operation queue(管理任務(wù),安排任務(wù))
以GCD為例:
程序員所需要做的就是按照GCD的規(guī)則(串行并行,同步異步)創(chuàng)建添加任務(wù)
可以將串行并行,同步異步理解為任務(wù)的屬性
通過指定任務(wù)的串行并行,GCD判斷如何分配任務(wù)即分配任務(wù)給哪個(gè)線程
通過指定任務(wù)的同步異步,GCD告訴將要執(zhí)行該任務(wù)的線程如何處理新任務(wù)與其當(dāng)前任務(wù)的關(guān)系
3.線程(執(zhí)行任務(wù))
執(zhí)行任務(wù)的人(干活的)
4.RunLoop(為線程監(jiān)測(cè)事件,事件發(fā)生時(shí)告訴線程執(zhí)行事件觸發(fā)的任務(wù))
Runloop負(fù)責(zé)監(jiān)測(cè)處理 UI 事件、計(jì)時(shí)器,以及其它內(nèi)核相關(guān)事件。
無論開發(fā)者什么時(shí)候設(shè)置計(jì)時(shí)器、使用NSURLConnection或者調(diào)用performSelector:withObject:afterDelay:,其實(shí)背后都是 run loop 在處理這些異步事件。
5.資源(線程執(zhí)行任務(wù)所需,如內(nèi)存等)
6.Autoreleasepool(為線程清理執(zhí)行任務(wù)后產(chǎn)生的垃圾)
Autoreleasepool工作原理:?
RunLoop在線程執(zhí)行完一次任務(wù)后銷毀當(dāng)前Autoreleasepool同時(shí)為線程創(chuàng)建一個(gè)新的Autoreleasepool以便線程下一次執(zhí)行任務(wù)使用
Autoreleasepool被銷毀會(huì)引起Autoreleasepool中所有的對(duì)象release從而釋放內(nèi)存
三、存在的挑戰(zhàn)
資源共享,互斥鎖,死鎖,資源饑餓,優(yōu)先級(jí)反轉(zhuǎn)
四
操作隊(duì)列提供了在 GCD 中不那么容易復(fù)制的有用特性。其中最重要的一個(gè)就是可以取消在任務(wù)處理隊(duì)列中的任務(wù),在稍后的例子中我們會(huì)看到這個(gè)。而且操作隊(duì)列在管理操作間的依賴關(guān)系方面也容易一些。另一面,GCD 給予你更多的控制權(quán)力以及操作隊(duì)列中所不能使用的底層函數(shù)。