淺析多線程GCD

GCD的基本使用代碼

// ViewController.h
#import <UIKit/UIKit.h>

@interface ViewController : UIViewController

@end

// ViewController.m

#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController

#pragma mark --------------------
#pragma mark Events
/*
隊(duì)列,都是用來存放任務(wù)
并發(fā)隊(duì)列:允許多個(gè)任務(wù)同時(shí)執(zhí)行
    1)直接create dispatch_queue_create
    2)全局并發(fā)隊(duì)列
 
串行隊(duì)列:只能一個(gè)接著一個(gè)的執(zhí)行
    1)直接create dispatch_queue_create
    2)主隊(duì)列:
        1)所有在主隊(duì)列中的任務(wù)都會被放在主線程中執(zhí)行
        2)主隊(duì)列中的任務(wù)在執(zhí)行之前會先檢查主線程的狀態(tài),
          如果發(fā)現(xiàn)主線程當(dāng)前正在執(zhí)行任務(wù)那么會暫停隊(duì)列中任務(wù)的調(diào)度
 同步:必須要得到該方法的返回值才能夠繼續(xù)往下執(zhí)行--->如果我沒有執(zhí)行完畢,那么后面的將永遠(yuǎn)無法執(zhí)行
 異步:可以繼續(xù)往下執(zhí)行,等前面的任務(wù)執(zhí)行完畢之后再回頭執(zhí)行-->我無所謂,你可以先執(zhí)行后面的代碼
 */

// 同步:只能在當(dāng)前線程中執(zhí)行任務(wù),不具備開啟新線程的能力
// 異步:可以在新的線程中執(zhí)行任務(wù),具備開啟新線程的能力
-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
//    異步函數(shù)+主隊(duì)列
//    [self asyncMian];
//    同步函數(shù)+主隊(duì)列
//    [self syncMian];
//    異步函數(shù)+并發(fā)隊(duì)列
//    [self asyncConCurrent];
//    異步函數(shù)+串行隊(duì)列
//    [self asyncSerial];
    // 同步函數(shù)+并發(fā)隊(duì)列
//    [self syncConCurrent];
    // 同步函數(shù)+串行
    [self syncSerial];
}

#pragma mark --------------------
#pragma mark - Methods
// 異步函數(shù)+主隊(duì)列:不會開線程,所有的任務(wù)串行執(zhí)行,在主線程執(zhí)行
/*
 1---<NSThread: 0x600000077f80>{number = 1, name = main}
 2---<NSThread: 0x600000077f80>{number = 1, name = main}
 3---<NSThread: 0x600000077f80>{number = 1, name = main}
 4---<NSThread: 0x600000077f80>{number = 1, name = main}
 */
- (void)asyncMian {
    // 獲得主隊(duì)列
    dispatch_queue_t queue = dispatch_get_main_queue();
    // 封裝任務(wù)
    dispatch_async(queue, ^{
        NSLog(@"1---%@", [NSThread currentThread]);
    });
    dispatch_async(queue, ^{
        NSLog(@"2---%@", [NSThread currentThread]);
    });
    dispatch_async(queue, ^{
        NSLog(@"3---%@", [NSThread currentThread]);
    });
    dispatch_async(queue, ^{
        NSLog(@"4---%@", [NSThread currentThread]);
    });
}

// 同步函數(shù)+主隊(duì)列:
// 會死鎖
- (void)syncMian {
    // 獲得主隊(duì)列
    dispatch_queue_t queue = dispatch_get_main_queue();
    NSLog(@"%s",__func__);
    // 封裝任務(wù)
    dispatch_sync(queue, ^{
        NSLog(@"1---%@",[NSThread currentThread]);
    });
    
    dispatch_sync(queue, ^{
        NSLog(@"2---%@",[NSThread currentThread]);
    });
    
    dispatch_sync(queue, ^{
        NSLog(@"3---%@",[NSThread currentThread]);
    });
    
    dispatch_sync(queue, ^{
        NSLog(@"4---%@",[NSThread currentThread]);
    });
    
    dispatch_sync(queue, ^{
        NSLog(@"5---%@",[NSThread currentThread]);
    });
}

// 異步函數(shù)+并發(fā)隊(duì)列
/*
// 會不會開線程:會
// 如果開線程,那么開幾條?多條(并不是有幾個(gè)任務(wù)就開幾條線程)
// 隊(duì)列內(nèi)部任務(wù)如何執(zhí)行:并發(fā)
 */

/*
 start------
 end------
 2---<NSThread: 0x600000074440>{number = 4, name = (null)}
 1---<NSThread: 0x608000071040>{number = 3, name = (null)}
 3---<NSThread: 0x600000076dc0>{number = 5, name = (null)}
 */
- (void)asyncConCurrent {
    //1.創(chuàng)建隊(duì)列?
    /*
     第一個(gè)參數(shù):標(biāo)簽 隊(duì)列的名稱 C語言
     第二個(gè)參數(shù):隊(duì)列的類型
     */
    //dispatch_queue_t queue = dispatch_queue_create("com.seemygo.www.download", DISPATCH_QUEUE_CONCURRENT);
    
    // 獲得全局并發(fā)隊(duì)列
    /*
     第一個(gè)參數(shù):優(yōu)先級
     第二個(gè)參數(shù):留給未來使用的0
     */
    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    
    NSLog(@"start------");
    // 2.使用異步函數(shù)添加操作到隊(duì)列中
    // 該方法完成了以下操作:1)封裝任務(wù) 2)把任務(wù)添加到隊(duì)列
    dispatch_async(queue, ^{
        NSLog(@"1---%@",[NSThread currentThread]);
    });
    
    dispatch_async(queue, ^{
        NSLog(@"2---%@",[NSThread currentThread]);
    });
    
    dispatch_async(queue, ^{
        NSLog(@"3---%@",[NSThread currentThread]);
    });

    NSLog(@"end------");
}

// 異步函數(shù)+串行隊(duì)列
/*
//會不會開線程:會
//如果開線程,那么開幾條?1
//隊(duì)列內(nèi)部任務(wù)如何執(zhí)行:串行
 */
/*
 start------
 end------
 1---<NSThread: 0x60000026bb00>{number = 3, name = (null)}
 2---<NSThread: 0x60000026bb00>{number = 3, name = (null)}
 3---<NSThread: 0x60000026bb00>{number = 3, name = (null)}
 4---<NSThread: 0x60000026bb00>{number = 3, name = (null)}
 */
-(void)asyncSerial {
    //1.創(chuàng)建隊(duì)列
    /*
     第一個(gè)參數(shù):標(biāo)簽 隊(duì)列的名稱 C語言
     第二個(gè)參數(shù):隊(duì)列的類型
     */
    dispatch_queue_t queue = dispatch_queue_create("com.seemygo.www.download", DISPATCH_QUEUE_SERIAL);
    NSLog(@"start------");
    //2.使用異步函數(shù)添加操作到隊(duì)列中
    //該方法完成了以下操作:1)封裝任務(wù) 2)把任務(wù)添加到隊(duì)列
    dispatch_async(queue, ^{
        NSLog(@"1---%@",[NSThread currentThread]);
    });
    
    dispatch_async(queue, ^{
        NSLog(@"2---%@",[NSThread currentThread]);
    });
    
    dispatch_async(queue, ^{
        NSLog(@"3---%@",[NSThread currentThread]);
    });
    
    dispatch_async(queue, ^{
        NSLog(@"4---%@",[NSThread currentThread]);
    });
    
    NSLog(@"end------");
}

// 同步函數(shù)+并發(fā)隊(duì)列
/*
//會不會開線程:不會
//如果開線程,那么開幾條 X
//隊(duì)列內(nèi)部任務(wù)如何執(zhí)行:串行
 */
/*
 start------
 1---<NSThread: 0x600000063740>{number = 1, name = main}
 2---<NSThread: 0x600000063740>{number = 1, name = main}
 3---<NSThread: 0x600000063740>{number = 1, name = main}
 4---<NSThread: 0x600000063740>{number = 1, name = main}
 end------
 */
- (void)syncConCurrent {
    //1.創(chuàng)建隊(duì)列
    /*
     第一個(gè)參數(shù):標(biāo)簽 隊(duì)列的名稱 C語言
     第二個(gè)參數(shù):隊(duì)列的類型
     */
    dispatch_queue_t queue = dispatch_queue_create("com.seemygo.www.download", DISPATCH_QUEUE_CONCURRENT);
    
     NSLog(@"start------");
    //2.使用同步函數(shù)添加操作到隊(duì)列中
    //該方法完成了以下操作:1)封裝任務(wù) 2)把任務(wù)添加到隊(duì)列
    dispatch_sync(queue, ^{
        NSLog(@"1---%@",[NSThread currentThread]);
    });
    
    dispatch_sync(queue, ^{
        NSLog(@"2---%@",[NSThread currentThread]);
    });
    
    dispatch_sync(queue, ^{
        NSLog(@"3---%@",[NSThread currentThread]);
    });
    
    dispatch_sync(queue, ^{
        NSLog(@"4---%@",[NSThread currentThread]);
    });
    
     NSLog(@"end------");
}

// 同步函數(shù)+串行
/*
//會不會開線程:不會
//如果開線程,那么開幾條 X
//隊(duì)列內(nèi)部任務(wù)如何執(zhí)行:串行
 */
/*
 start------
 1---<NSThread: 0x60000007cb00>{number = 1, name = main}
 2---<NSThread: 0x60000007cb00>{number = 1, name = main}
 3---<NSThread: 0x60000007cb00>{number = 1, name = main}
 4---<NSThread: 0x60000007cb00>{number = 1, name = main}
 end------
 */
-(void)syncSerial
{
    //1.創(chuàng)建隊(duì)列
    /*
     第一個(gè)參數(shù):標(biāo)簽 隊(duì)列的名稱 C語言
     第二個(gè)參數(shù):隊(duì)列的類型
     */
    dispatch_queue_t queue = dispatch_queue_create("com.seemygo.www.download", DISPATCH_QUEUE_SERIAL);
    NSLog(@"start------");
    //2.使用同步函數(shù)添加操作到隊(duì)列中
    //該方法完成了以下操作:1)封裝任務(wù) 2)把任務(wù)添加到隊(duì)列
    dispatch_sync(queue, ^{
        NSLog(@"1---%@",[NSThread currentThread]);
    });
    
    dispatch_sync(queue, ^{
        NSLog(@"2---%@",[NSThread currentThread]);
    });
    
    dispatch_sync(queue, ^{
        NSLog(@"3---%@",[NSThread currentThread]);
    });
    
    dispatch_sync(queue, ^{
        NSLog(@"4---%@",[NSThread currentThread]);
    });
    NSLog(@"end------");
}

@end

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,578評論 6 544
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,701評論 3 429
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,691評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,974評論 1 318
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 72,694評論 6 413
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 56,026評論 1 329
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,015評論 3 450
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 43,193評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,719評論 1 336
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 41,442評論 3 360
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 43,668評論 1 374
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,151評論 5 365
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,846評論 3 351
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,255評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,592評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 52,394評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 48,635評論 2 380

推薦閱讀更多精彩內(nèi)容