同樣通過兩個方法,分別來演示并發隊列與同步執行和異步執行任務的區別:
- 示例代碼:
#pragma mark -- 并行隊列與同步、異步的組合
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
// 同步執行
// [self concurrentSync];
// 異步執行
[self concurrentAsync];
}
#pragma mark -- 并行同步
- (void)concurrentSync{
// 同步
// 1.創建并行隊列
dispatch_queue_t concurrentQueue = dispatch_queue_create("concurrentQueue", DISPATCH_QUEUE_CONCURRENT);
// 2.創建任務
dispatch_block_t taskBlock1 = ^{
[NSThread sleepForTimeInterval:5];
NSLog(@"Task1-->%@",[NSThread currentThread]);
};
dispatch_block_t taskBlock2 = ^{
NSLog(@"Task2-->%@",[NSThread currentThread]);
};
// 同步執行
dispatch_sync(concurrentQueue, taskBlock1);
dispatch_sync(concurrentQueue, taskBlock2);
// 結論: 在當前的線程執行(同步不具備開啟新線程能力),任務依次執行
}
#pragma mark -- 并行異步
- (void)concurrentAsync{
// 異步
// 1.創建并行隊列
dispatch_queue_t concurrentQueue = dispatch_queue_create("concurrentQueue", DISPATCH_QUEUE_CONCURRENT);
// 2.創建任務
dispatch_block_t taskBlock1 = ^{
[NSThread sleepForTimeInterval:5];
NSLog(@"Task1-->%@",[NSThread currentThread]);
};
dispatch_block_t taskBlock2 = ^{
NSLog(@"Task2-->%@",[NSThread currentThread]);
};
// 異步執行(每添加一個任務就開啟一條線程)
dispatch_async(concurrentQueue, taskBlock1);
dispatch_async(concurrentQueue, taskBlock2);
// 結論: 開啟線程執行任務(根據任務開啟多條線程),任務并行處理(沒有按照添加到隊列中的順序來執行)
}
@end
雖然先將task1添加到隊列中,但是手動進行了延遲處理,因為并發隊列和異步處理共同決定開啟了多條線程,雖然task1先從隊列中取出執行,但task2任務耗費時間相對較短,CPU在隨機調度后,task2先被執行完畢
- 結論:
1.并行隊列,異步執行
開多個線程,異步執行
每次開啟多少個線程是不固定的(線程數,不由我們控制),線程數是由GCD來決定的(線程池)
2.并行隊列,同步執行
不開線程,順序執行