1. 在iOS中隊(duì)列分為以下幾種:
- 串行隊(duì)列:(
隊(duì)列中的任務(wù)只會順序執(zhí)行句喜,任務(wù)按往隊(duì)列里的添加先后順序執(zhí)行,先進(jìn)先出(FIFO),前一個(gè)任務(wù)執(zhí)行完再開始執(zhí)行下一個(gè)任務(wù)媚朦。(我們開發(fā)中主線程隊(duì)列就是一個(gè)串行隊(duì)列,所以我們經(jīng)常在主線程寫的一般任務(wù)(不考慮多線程)日戈,都是順序執(zhí)行的)询张。
注意一個(gè)串行隊(duì)列里只有一個(gè)線程。
)
dispatch_queue_t q = dispatch_queue_create("...", DISPATCH_QUEUE_SERIAL);
- 并行隊(duì)列: (
任務(wù)會在這個(gè)隊(duì)列中新開線程浙炼,并發(fā)同時(shí)執(zhí)行(無序)份氧。
)
dispatch_queue_t q = dispatch_queue_create("......",DISPATCH_QUEUE_CONCURRENT);
- 全局隊(duì)列:(
是系統(tǒng)的唯袄,直接拿過來(GET)用就可以;與并行隊(duì)列類似
)
dispatch_queue_t q = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
- 主隊(duì)列:(
每一個(gè)應(yīng)用程序?qū)?yīng)唯一主隊(duì)列蜗帜,直接GET即可恋拷;在多線程開發(fā)中,使用主隊(duì)列更新UI
)
dispatch_queue_t q = dispatch_get_main_queue();
2. 線程執(zhí)行方式
- 同步執(zhí)行 (
任務(wù)都在當(dāng)前線程中執(zhí)行厅缺,執(zhí)行過程中會阻塞當(dāng)前線程
)
dispatch_async(queue, ^{ // 執(zhí)行代碼 })
- 異步執(zhí)行(
任務(wù)會開辟新的線程蔬顾,并在新的線程中執(zhí)行,不會阻塞當(dāng)前線程
)
dispatch_sync(queue, ^{ // 執(zhí)行代碼 })
根據(jù)不同的隊(duì)列種類及執(zhí)行方式組和為一下四種形式
- 1)串行隊(duì)列同步執(zhí)行
- 2)串行隊(duì)列異步執(zhí)行
- 3)并發(fā)隊(duì)列同步執(zhí)行
- 4)并發(fā)隊(duì)列異步執(zhí)行
并行隊(duì)列 | 串行隊(duì)列 | |
---|---|---|
同步執(zhí)行(無開啟新線程能力 ) |
任務(wù)都在當(dāng)前線程執(zhí)行(同步)湘捎,但是是順序執(zhí)行的(并沒有體現(xiàn)并發(fā)的特性)(不開啟新線程 ) |
任務(wù)都在當(dāng)前線程執(zhí)行(同步)诀豁,并且順序執(zhí)行(串行)(不開啟新線程 ) |
異步執(zhí)行(有開啟新線程的能力 ) |
任務(wù)在開辟的多個(gè)子線程中執(zhí)行(異步),并且是同時(shí)執(zhí)行的(并發(fā))(開啟多調(diào)子線程 ) |
任務(wù)都在開辟的新的子線程中執(zhí)行(異步)窥妇,并且順序執(zhí)行(串行)(開啟一條子線程 ) |
更多細(xì)節(jié)見下圖: