結(jié)合GCD來簡(jiǎn)單分析同步、異步、串行、并行。
正在進(jìn)行中的程序被稱為進(jìn)程(一個(gè)正在運(yùn)行的App),負(fù)責(zé)程序運(yùn)行的內(nèi)存分配;每一個(gè)進(jìn)程都有自己獨(dú)立的虛擬內(nèi)存空間。線程是進(jìn)程中一個(gè)獨(dú)立的執(zhí)行路徑(控制單元),一個(gè)進(jìn)程中至少包含一條線程,即主線程,線程里面有非常多的任務(wù)(同步,異步)
1.同步 dispatch_sync
按照代碼的編寫順序執(zhí)行
2.異步 dispatch_async
并發(fā)執(zhí)行,無法確定任務(wù)的執(zhí)行順序
3.串行隊(duì)列 DISPATCH_QUEUE_SERIAL
任務(wù)按照順序被調(diào)度,前一個(gè)任務(wù)不執(zhí)行完畢,隊(duì)列不會(huì)調(diào)度,任務(wù)只會(huì)順序執(zhí)行
4.并行隊(duì)列 DISPATCH_QUEUE_CONCURRENT
只要有空閑的線程,隊(duì)列就會(huì)調(diào)度當(dāng)前任務(wù),交給線程去執(zhí)行,不會(huì)強(qiáng)制來等待上一個(gè)任務(wù)執(zhí)行完畢,而是會(huì)在有空閑線程時(shí)來繼續(xù)調(diào)度下一個(gè)任務(wù)
串行隊(duì)列同步執(zhí)行
隊(duì)列會(huì)按順序來調(diào)度任務(wù),任務(wù)在一個(gè)線程里運(yùn)行
dispatch_queue_t serialQueue = dispatch_queue_create( "my.serialQueue", DISPATCH_QUEUE_SERIAL);
dispatch_sync(serialQueue, ^{
for (int i = 0; i < 100000; i++) {
}
NSLog(@"第一條%@",[NSThread currentThread]);
});
dispatch_sync(serialQueue, ^{
for (int i = 0; i < 100000; i++) {
if (i == 99999)
NSLog(@"第二條%@",[NSThread currentThread]);
}
});
dispatch_sync(serialQueue, ^{
NSLog(@"第三條%@",[NSThread currentThread]);
});

串行隊(duì)列異步執(zhí)行
按順序來調(diào)度任務(wù),任務(wù)會(huì)創(chuàng)建新的線程
dispatch_queue_t serialQueue = dispatch_queue_create( "my.serialQueue", DISPATCH_QUEUE_SERIAL);
dispatch_async(serialQueue, ^{
for (int i = 0; i < 100000; i++) {
}
NSLog(@"第一條%@",[NSThread currentThread]);
});
dispatch_async(serialQueue, ^{
for (int i = 0; i < 100000; i++) {
if (i == 99999)
NSLog(@"第二條%@",[NSThread currentThread]);
}
});
dispatch_async(serialQueue, ^{
NSLog(@"第三條%@",[NSThread currentThread]);
});

并行隊(duì)列同步執(zhí)行
不會(huì)等待一個(gè)任務(wù)執(zhí)行完畢便再次調(diào)度下一個(gè)任務(wù)(調(diào)度任務(wù),不控制任務(wù)的執(zhí)行),但同步任務(wù)不會(huì)開啟新的線程
dispatch_queue_t conCurrentQueue = dispatch_queue_create( "my.conCurrentQueue", DISPATCH_QUEUE_CONCURRENT);
dispatch_sync(conCurrentQueue, ^{
for (int i = 0; i < 100000; i++) {
}
NSLog(@"第一條%@",[NSThread currentThread]);
});
dispatch_sync(conCurrentQueue, ^{
for (int i = 0; i < 100000; i++) {
if (i == 99999)
NSLog(@"第二條%@",[NSThread currentThread]);
}
});
dispatch_sync(conCurrentQueue, ^{
NSLog(@"第三條%@",[NSThread currentThread]);
});

并行隊(duì)列異步執(zhí)行
操作會(huì)新建多個(gè)線程、操作無序執(zhí)行,不會(huì)強(qiáng)制來等待上一個(gè)任務(wù)執(zhí)行完畢,而是會(huì)在有空閑線程時(shí)來繼續(xù)調(diào)度下一個(gè)任務(wù),而此時(shí)任務(wù)會(huì)創(chuàng)建新的線程來執(zhí)行,故這種組合可以實(shí)現(xiàn)任務(wù)的并發(fā)
dispatch_queue_t conCurrentQueue = dispatch_queue_create( "my.conCurrentQueue", DISPATCH_QUEUE_CONCURRENT);
dispatch_async(conCurrentQueue, ^{
for (int i = 0; i < 100000; i++) {
}
NSLog(@"第一條%@",[NSThread currentThread]);
});
dispatch_async(conCurrentQueue, ^{
for (int i = 0; i < 100000; i++) {
if (i == 99999)
NSLog(@"第二條%@",[NSThread currentThread]);
}
});
dispatch_async(conCurrentQueue, ^{
NSLog(@"第三條%@",[NSThread currentThread]);
});
