平常開發中會經常用gcd做一下多線程任務,但一直沒有對同步、異步任務在串行、並行隊列的執行情況做個全面的認識,今天寫了個demo跑了下,還是有些新發現的。
代碼如下:
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
[self gcdTest];
}
-(void)gcdTest
{
dispatch_queue_t serialQueue= dispatch_queue_create("串行隊列", DISPATCH_QUEUE_SERIAL);
dispatch_queue_t concurrentQueue=dispatch_queue_create("並行隊列", DISPATCH_QUEUE_CONCURRENT);
dispatch_queue_t mainQueue=dispatch_get_main_queue();
dispatch_queue_t globalQueue=dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
//1:
// for(int i=0;i<10;i++){
// dispatch_sync(serialQueue, ^{
// NSLog(@"任務執行中....-%d\n mainThread:%@",i,[NSThread currentThread]);
// });
// }
//結果,同步任務在串行隊列中,在主線程下串行執行
//2:
// for(int i=0;i<10;i++){
// dispatch_sync(concurrentQueue, ^{
// NSLog(@"任務執行中....-%d\n mainThread:%@",i,[NSThread currentThread]);
// });
// }
//結果,同步任務在並行隊列中,在主線程下串行執行
//3:
// for(int i=0;i<10;i++){
// dispatch_sync(mainQueue, ^{
// NSLog(@"任務執行中....-%d\n mainThread:%@",i,[NSThread currentThread]);
// });
// }
//結果,同步任務在主隊列中,鎖死
//4:
// for(int i=0;i<10;i++){
// dispatch_sync(globalQueue, ^{
// NSLog(@"任務執行中....-%d\n mainThread:%@",i,[NSThread currentThread]);
// });
// }
//結果,同步任務在全局隊列中,在主線程下串行執行
//5:
// for(int i=0;i<10;i++){
// dispatch_async(serialQueue, ^{
// NSLog(@"任務執行中....-%d\n mainThread:%@",i,[NSThread currentThread]);
// });
// }
//結果,異步任務在串行隊列中,在一個子線程中串行執行
//6:
// for(int i=0;i<10;i++){
// dispatch_async(concurrentQueue, ^{
// NSLog(@"任務執行中....-%d\n mainThread:%@",i,[NSThread currentThread]);
// });
// }
//結果,異步任務在並行隊列中,在多個子線程中並行執行
//7:
// for(int i=0;i<10;i++){
// dispatch_async(mainQueue, ^{
// NSLog(@"任務執行中....-%d\n mainThread:%@",i,[NSThread currentThread]);
// });
// }
//結果,異步任務在主隊列中,在主線程中串行執行
//8:
for(int i=0;i<10;i++){
dispatch_async(globalQueue, ^{
NSLog(@"任務執行中....-%d\n mainThread:%@",i,[NSThread currentThread]);
});
}
//結果,異步任務在全局隊列中,在多個子線程中並行執行
}
總結如下:
dispatch_sync:同步任務無論在自定義串行隊列、自定義並行隊列、主隊列(當前線程為主線程時會出現死鎖)、全局隊列 執行任務時,都不會創建子線程,而是在當前線程中串行執行;
dispatch_async:異步任務無論在自定義串行隊列、自定義並行隊列(主隊列除外,主隊列下,任務會在主線中串行執行)、全局隊列 執行任務時,都會創建子線程,並且在子線程中執行;
