多線程GCD--”牛逼的中樞調度器(二)“

核心概念:將任務添加到隊列,指定任務執(zhí)行方法
任務
*使用block 封裝
*block 就是一個提前準備好的代碼塊,在需要的時候執(zhí)行
隊列
*串行:一個接一個的調度任務
*并發(fā):可以同時調度多個任務
任務執(zhí)行函數(shù) (都需要在線程中操作)
*同步執(zhí)行:當前指令不完成,不會執(zhí)行下個指令(不會到線程池中拿子線程)
*異步執(zhí)行:當前指令不完成,不會等待 繼續(xù)執(zhí)行下個指令(只要有任務,就會到線程池中取子線程;主隊列除外!)

開不開線程,取決于執(zhí)行任務的函數(shù),同步不開異步開
開幾條線程,取決于隊列,串行一條 并發(fā)多條(異步)

-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
//    [self gcdDemo1];
//    [self gcdDemo2];
//    [self gcdDemo3];
//    [self gcdDemo4];
    [self gcdDemo6];
}
//串行隊列:同步任務
//不會開啟線程 順序執(zhí)行
-(void)gcdDemo1{
    /**
    1.隊列 名稱
    2.隊列的屬性 DISPATCH_QUEUE_SERIAL 標識串行
    */
    dispatch_queue_t q =dispatch_queue_create(@"lsgcd", NULL);

    //同步執(zhí)行任務
    for (int i=0; i<10; i++) {
        dispatch_sync(q, ^{
            NSLog(@"%@ %d",[NSThread currentThread],i);
        });
    }

}
//串行隊列 異步任務
- (void)gcdDemo2{
    /**
    1.隊列 名稱
    2.隊列的屬性 DISPATCH_QUEUE_SERIAL 標識串行
    */
    dispatch_queue_t q =dispatch_queue_create(@"lsgcd", NULL);

    //異步執(zhí)行任務
    for (int i=0; i<10; i++) {
        NSLog(@"%d---------",i);
        dispatch_async(q, ^{
            NSLog(@"%@ %d",[NSThread currentThread],i);
        });
    }
    //主線程任務
    NSLog(@"over");
}
//并發(fā)隊列 異步執(zhí)行
- (void)gcdDemo3{
    /**
    1.隊列 名稱
    2.隊列的屬性 DISPATCH_QUEUE_CONCURRENT 標識并行
    */
    dispatch_queue_t q =dispatch_queue_create(@"lsgcd", DISPATCH_QUEUE_CONCURRENT);

    //異步執(zhí)行任務
    for (int i=0; i<10; i++) {
//        NSLog(@"%d---------",i);

        dispatch_async(q, ^{
            NSLog(@"%@ %d",[NSThread currentThread],i);
        });
    }
    //主線程任務
    NSLog(@"over");
}

//并發(fā)隊列 同步執(zhí)行
//不會開啟線程 循序執(zhí)行
- (void)gcdDemo4{
    /**
    1.隊列 名稱
    2.隊列的屬性 DISPATCH_QUEUE_CONCURRENT 標識并行
    */
    dispatch_queue_t q =dispatch_queue_create(@"lsgcd", DISPATCH_QUEUE_CONCURRENT);

    //異步執(zhí)行任務
    for (int i=0; i<10; i++) {
//        NSLog(@"%d---------",i);

    dispatch_sync(q, ^{
        NSLog(@"%@ %d",[NSThread currentThread],i);
    });
}
//主線程任務
NSLog(@"over");
}

#pragma mark 同步任務
//作用:在開發(fā)中 通常將耗時操作 放在后臺執(zhí)行,有些任務彼此有’依賴‘關系
//例子:登錄 支付 下載
- (void)gcdDemo5{
    dispatch_queue_t loginQueue =dispatch_queue_create(@"lsGCD", DISPATCH_QUEUE_CONCURRENT);
    dispatch_sync(loginQueue, ^{
        NSLog(@"用戶登錄 %@",[NSThread currentThread]);
    });

    dispatch_async(loginQueue, ^{
        NSLog(@"用戶支付 %@",[NSThread currentThread]);
    });

    dispatch_async(loginQueue, ^{
     NSLog(@"用戶下載 %@",[NSThread currentThread]);
    });
}
//增強版同步任務
//可以讓隊列調度多個任務前 指定一個同步任務 讓所有的異步w任務,等待同步任務執(zhí)行完成,這就是依賴關系
//同步任務會造成一個死鎖
- (void)gcdDemo6{
    //隊列
    dispatch_queue_t loginQueue = dispatch_queue_create(@"lsGCD", DISPATCH_QUEUE_CONCURRENT);
    void(^task)() = ^{
        for (int i=0 ; i <10; i++) {
            NSLog(@"%d %@",i,[NSThread currentThread]);
        }
        dispatch_sync(loginQueue, ^{
         NSLog(@"用戶登錄 %@",[NSThread currentThread]);
        });
    
        dispatch_async(loginQueue, ^{
            NSLog(@"用戶支付 %@",[NSThread currentThread]);
        });
    
        dispatch_async(loginQueue, ^{
         NSLog(@"用戶下載 %@",[NSThread currentThread]);
        });
    };

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

相關閱讀更多精彩內容

友情鏈接更多精彩內容