GCD的隊(duì)列可以分為2大類型:串行隊(duì)列咆耿、并發(fā)隊(duì)列德谅。
一: 串行隊(duì)列(Serial Dispatch Queue):
一次只調(diào)度一個(gè)任務(wù),隊(duì)列中的任務(wù)一個(gè)接著一個(gè)地執(zhí)行(一個(gè)任務(wù)執(zhí)行完畢后萨螺,再執(zhí)行下一個(gè)任務(wù))
創(chuàng)建一個(gè)隊(duì)列:
dispatch_queue_t q = dispatch_queue_create(const char *label, dispatch_queue_attr_t attr)
參數(shù):
const char *label:隊(duì)列的名稱
dispatch_queue_attr_t attr:隊(duì)列的屬性窄做,屬性有兩個(gè),分別為:
DISPATCH_QUEUE_SERIAL(NULL)
串行隊(duì)列
DISPATCH_QUEUE_CONCURRENT
并發(fā)隊(duì)列
隊(duì)列屬性為宏慰技,其中串行隊(duì)列的宏值為NULL椭盏,所以創(chuàng)建一個(gè)串行隊(duì)列可以用如下代碼:
dispatch_queue_t q = dispatch_queue_create(“chuanXing", NULL);
一個(gè)串行的異步任務(wù)演示如下:
for ( int i = 0 ; i < 10; ++i) {
// 10 個(gè)異步
dispatch_async(q, ^{
NSLog(@“%@ - %d", [NSThread currentThread],i);
});
}
NSLog(@"come here - %@“, [NSThread currentThread]);
執(zhí)行結(jié)果如下:
主線程執(zhí)行時(shí)間并不確定吻商,但將10個(gè)異步任務(wù)添加的串行隊(duì)列中乌叶,無論如何都會(huì)依次一個(gè)一個(gè)執(zhí)行,而且只會(huì)開啟一條線程乐横。
如果將任務(wù)改為同步任務(wù)谈撒,那么運(yùn)行結(jié)果可想而知(同步任務(wù)的特性)
二、并發(fā)隊(duì)列:
并發(fā)隊(duì)列可以讓多個(gè)任務(wù)并發(fā)(同時(shí))執(zhí)行,它會(huì)自動(dòng)開啟多個(gè)線程同時(shí)執(zhí)行任務(wù)裆悄,并發(fā)功能只有在異步函數(shù)下才會(huì)有效光稼,例如有如下代碼孩等,并行隊(duì)列下執(zhí)行同步任務(wù):
// 1. 隊(duì)列
dispatch_queue_t q = dispatch_queue_create("zfl", DISPATCH_QUEUE_CONCURRENT);
// 2. 同步執(zhí)行
for(int i = 0 ; i < 10 ; ++i) {
dispatch_sync(q, ^{
NSLog( @"%@ %d" , [NSThread currentThread ], i);
});
}
NSLog(@"come here - %@" ,[NSThread currentThread]);
結(jié)果如下:
并發(fā)隊(duì)列下執(zhí)行同步函數(shù)不會(huì)創(chuàng)建新線程冰垄,所有任務(wù)依次在主線程上執(zhí)行。
再看看并發(fā)隊(duì)列下執(zhí)行異步函數(shù):
// 1. 隊(duì)列
dispatch_queue_t q = dispatch_queue_create("itheima", DISPATCH_QUEUE_CONCURRENT);
// 2. 同步執(zhí)行
for ( int i = 0 ; i < 10 ; ++i) {
dispatch_async(q, ^{
NSLog(@"%@ %d" , [NSThread currentThread ], i);
});
}
NSLog(@"come here - %@",[NSThread currentThread ]);
運(yùn)行結(jié)果如下:
由此可知并行隊(duì)列下地異步函數(shù)會(huì)開啟N條子線程步清,且執(zhí)行任務(wù)的順序我們無法控制尼啡,至于是哪條線程執(zhí)行任務(wù)由隊(duì)列決定狂巢,哪個(gè)任務(wù)先完成由CPU決定唧领。結(jié)果中number = 4和number = 2的子線程執(zhí)行了多次任務(wù)斩个,那是因?yàn)檫@兩條線程執(zhí)行完任務(wù)就會(huì)被線程池回收胯杭,隊(duì)列再從線程池中去線程執(zhí)行任務(wù)受啥,這時(shí)就會(huì)線程重復(fù)利用,如果沒有線程則會(huì)重新創(chuàng)建滚局。