同步,異步:
同步是指:當(dāng)一個(gè) block 被添加到 queue 時(shí),會(huì)阻塞當(dāng)前運(yùn)行的線程,直到 block 中的內(nèi)容執(zhí)行完畢,異步則不會(huì)阻塞當(dāng)前的線程
串行,并行:
串行,同一時(shí)間下只有一個(gè)任務(wù)被執(zhí)行,并行則可以有多個(gè)任務(wù)同時(shí)執(zhí)行
同步異步?jīng)Q定開不開線程,串行并行決定開幾條線程
代碼中都有注釋,很容易理解:
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
[self asyncGlobalQueue];
}
/// 同步不開辟線程,異步開啟新線程
/// 串行只開辟一條線程,并行開啟多條線程
/// 同步+ mainQueue 死鎖
/// 主線程先添加 dispatch_sync操作到 mainQueue,sync 使主線程陷
入等待dispatch_sync的 block 執(zhí)行結(jié)束,
/// dispatch_sync又添加 block 到 mainQueue, 該 block 只有結(jié)束后
dispatch_sync 才能完全結(jié)束,此刻mainQueue 中有兩個(gè)操作
/// 1. dispatch_sync 2.block dispatch 等待 block 結(jié)束, block 等待
dispatch_sync 結(jié)束, block 無法執(zhí)行
/// 死鎖
- (void)syncMainQueue
{
dispatch_sync(dispatch_get_main_queue(), ^{
NSLog(@"%@",[NSThread currentThread]);
});
NSLog(@"method end");
}
/// 同步 + 串行隊(duì)列
- (void)syncSerialQueue
{
// 第一個(gè)參數(shù): 表示隊(duì)列名
// 第二個(gè)參數(shù): NULL:創(chuàng)建串行隊(duì)列, DISPATCH_QUEUE_CONCURRENT
并發(fā)隊(duì)列
dispatch_queue_t sprialQueue = dispatch_queue_create("com.X-Liang", NULL);
dispatch_async(sprialQueue, ^{
NSLog(@"%@",[NSThread currentThread]);
dispatch_sync(sprialQueue, ^{
/// 此線程中sprialQueue 中有兩個(gè)操作 dispatch_sync, block, block 等待 dispatch_sync, dispacth_sync 等待
/// block 執(zhí)行,導(dǎo)致該線程死鎖, block 無法執(zhí)行
NSLog(@"Hello"); // 無法執(zhí)行
});
});
}
/// 同步 + 并行隊(duì)列
- (void)syncConcurrentQueue
{
/// dispatch_sync 任務(wù)被添加到 MainQueue 中, block 被添加到 global_queue 中
/// 又因?yàn)闉橥教砑?block ,所以 MainQueue 會(huì)等待 global_queu 中的 block 任務(wù)執(zhí)行完畢后,才繼續(xù)執(zhí)行
/// 2015-07-05 13:15:39.163 GCD[7372:349190] <NSThread: 0x7fd021411720>{number = 1, name = main}
/// 2015-07-05 13:15:39.163 GCD[7372:349190] method end
dispatch_sync(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
NSLog(@"%@",[NSThread currentThread]);
});
NSLog(@"method end");
}
/// 異步 + 串行
- (void)asyncSerialQueue
{
dispatch_queue_t serialQueue = dispatch_queue_create("com.X-Liang", NULL);
dispatch_async(serialQueue, ^{
NSLog(@"%@",[NSThread currentThread]);
});
}
/// 異步 + 并行
/**
* 異步函數(shù)+并發(fā)隊(duì)列
* 利用異步函數(shù),往并發(fā)隊(duì)列中添加任務(wù),會(huì)開辟與隊(duì)列中任務(wù)數(shù)相同的線程
*/
- (void)asyncGlobalQueue
{
// 1. 獲得全局并發(fā)隊(duì)列
/**
* 第一個(gè)參數(shù)設(shè)置隊(duì)列的優(yōu)先級(jí)
* 第二個(gè)參數(shù)設(shè)置一個(gè)標(biāo)志,設(shè)置為0
*/
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
// 異步(具備開辟線程能力)并發(fā)執(zhí)行
dispatch_async(queue, ^{
NSLog(@"%@",[NSThread currentThread]);
for (int index = 0; index < 100; ++index) {
NSLog(@"A");
}
});
dispatch_async(queue, ^{
NSLog(@"%@",[NSThread currentThread]);
for (int index = 0; index < 100; ++index) {
NSLog(@"B");
}
});
dispatch_async(queue, ^{
NSLog(@"%@",[NSThread currentThread]);
for (int index = 0; index < 100; ++index) {
NSLog(@"B");
}
});
}
有錯(cuò)請(qǐng)指正,謝謝,共同學(xué)習(xí)進(jìn)步