面試題(四):多線程 gcd 經(jīng)常用到哪些方法

目錄
  1.1 概述
  1.2 請求數(shù)據(jù),主線程刷新
  1.3 串行隊列
  1.4 并行隊列
1.1 概述

1)CGD是基于C語言開發(fā)的一套多線程開發(fā)機制,也是目前蘋果官方推薦的多線程開發(fā)方法


2)GCD會自動管理線程的生命周期(創(chuàng)建線程、調(diào)度任務(wù)、銷毀線程),程序員只需要告訴GCD想要執(zhí)行什么任務(wù),不需要編寫任何代碼管理線程


3)GCD是這三種多線程開發(fā)方式中抽象層次最高的,使用起來也是最為方便的,只是基于C語言開發(fā),并不像前兩種是面向?qū)ο箝_發(fā),而是完全面向過程的


4)優(yōu)點,他對于多核運算更加有效,會自動利用更多的CPU內(nèi)核



5)GCD中也有類似于NSOperationQueue的隊列,GCD統(tǒng)一管理整個隊列中的任務(wù),GCD中的隊列分為并行隊列和串行隊列兩類


串行隊列


只有一個線程,加入到隊列中的操作按添加順序執(zhí)行


并發(fā)隊列


有多個線程,操作進來以后會將這些線程安排在可用的處理器上,同時保證先進來的任務(wù)優(yōu)先處理



有4個術(shù)語比較容易混淆:同步、異步、并發(fā)、串行


同步和異步主要影響:能不能開啟新的線程

同步:只是在當(dāng)前線程中執(zhí)行任務(wù),不具備開啟新線程的能力

異步:可以在新的線程中執(zhí)行任務(wù),具備開啟新線程的能力


并發(fā)和串行主要影響:任務(wù)的執(zhí)行方式

并發(fā):允許多個任務(wù)并發(fā)(同時)執(zhí)行

串行:一個任務(wù)執(zhí)行完畢后,再執(zhí)行下一個任務(wù)
1.2 請求數(shù)據(jù),主線程刷新

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
    
    //請求數(shù)據(jù)
    
    NSURL * url = [NSURL URLWithString:@"http://www.baidu.com"];
    
    NSError * error;
    
    NSString * data = [NSString stringWithContentsOfURL:url encoding:NSUTF8StringEncoding error:&error];
    
    if (data != nil) {
        
        dispatch_async(dispatch_get_main_queue(), ^{
            
            //返回主線程刷新界面
            
        });
        
    } else {
        
        NSLog(@"error when download:%@", error);
        
    }
    
});
1.3 串行隊列

dispatch_async(dispatch_get_main_queue(), ^{
    
    sleep(2);
    
    NSLog(@"main 2");
    
}); dispatch_async(dispatch_get_main_queue(), ^{
    
    sleep(1);
    
    NSLog(@"main 1");
    
}); dispatch_async(dispatch_get_main_queue(), ^{
    
    sleep(3);
    
    NSLog(@"main 3");
    
});

//后面會等前面的任務(wù)執(zhí)行完再執(zhí)行
1.4 并行隊列

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

dispatch_group_t group = dispatch_group_create();

dispatch_group_async(group, queue, ^{

NSLog(@"異步1");

});

dispatch_group_async(group, queue, ^{

NSLog(@"異步2");

});

dispatch_group_async(group, queue, ^{

NSLog(@"異步3");

});

dispatch_group_async(group, queue, ^{

NSLog(@"異步4");

});

dispatch_group_notify(group, queue, ^{

NSLog(@"上面都執(zhí)行完,執(zhí)行這個");

});
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容