GCD小结
GCD是基于C語言的底層API,用Block定義任務(wù)用起來非常靈活便捷.
? GCD的基本思想是就將操作放在隊列中去執(zhí)行
(1)操作使用Blocks定義 (2)隊列負責調(diào)度任務(wù)執(zhí)行所在的線程以及具體的執(zhí)行時間 (3)隊列的特點是先進先出(FIFO)的,新添加至對列的操作都會排在隊尾 關(guān)于多線程的一些概念: ? GCD一共有5種隊列:main queue :主隊列,在主隊列中只有一個主線程,本質(zhì)也是一個串行隊列 high priority queue:高優(yōu)先級隊列 low?priority queue :低優(yōu)先級隊列 background?priority queue:后臺隊列 default?priority queue :默認優(yōu)先級隊列,也叫做自定義隊列,又分為: 1:串行隊列(serial queue):會順序執(zhí)行隊列的里面的任務(wù),一次只執(zhí)行一個任務(wù). 2:并行隊列(concurrent queue):會并發(fā)的執(zhí)行隊列里面的任務(wù),執(zhí)行順序不確定. 常用方法: dispatch_sync:同步操作(任務(wù)),會執(zhí)行完block的任務(wù)才進行下一個任務(wù). dispatch_async:異步操作(任務(wù)),會把block提交給隊列就立即返回,不去關(guān)心block是否完成,由隊列去安排調(diào)用里面添加的block. 隊列和任務(wù)的使用: (1):串行隊列加入同步任務(wù):不會產(chǎn)生新線程,隊列會把任務(wù)加入主線程中執(zhí)行,有順序. (2):串行隊列中加入異步任務(wù):會產(chǎn)生一個子線程.隊列會把任務(wù)加入到這個子線程中執(zhí)行,有順序. (3):并行隊列中加入同步任務(wù):不會產(chǎn)生新線程,隊列會把任務(wù)加入主線程中執(zhí)行,有順序 (4):并行隊列中加入異步任務(wù):根據(jù)需要產(chǎn)生多個子線程,任務(wù)沒有順序執(zhí)行 (5):主線程隊列和GCD創(chuàng)建的隊列是不同的。在GCD中創(chuàng)建的隊列優(yōu)先級沒有主隊列高,所以在GCD中的串行隊列開啟同步任務(wù)里面沒有嵌套任務(wù)是不會阻塞主線程 在主隊列中加入同步任務(wù): ?會造成死鎖,原因是主隊列中只有一個線程就是主線程,而且該線程除非關(guān)閉程序,否則一直循環(huán)執(zhí)行,同步任務(wù)在主隊列中優(yōu)先級較高,為了能夠執(zhí)行任務(wù) ? ?就想搶占主線程資源來執(zhí)行任務(wù),而主線程卻又默認優(yōu)先處理其他操作,不肯放手.兩個的優(yōu)先級都很高,最終導(dǎo)致死鎖,阻塞線程了. 在主隊列中加入異步任務(wù):主隊列會先降低異步任務(wù)的優(yōu)先級,等空閑時會把該異步任務(wù)放入主線程中執(zhí)行,所以不會造成堵塞,一般的UI更新都在主隊列的異步任務(wù)中完成.?
轉(zhuǎn)載于:https://www.cnblogs.com/congliang/p/3781129.html
總結(jié)
- 上一篇: c#中页面之间传值传参的六种方法
- 下一篇: debian清除无用的库文件(清理系统,