背景:
有四個線程A、B、C、D。
需求:
在A、B線程執(zhí)行完之后去執(zhí)行線程C、D。
實現(xiàn)方式:
GCD
1.利用GCD中的barrier
2.利用GCD中的group
? ? 2.1 利用在組中所有的線程執(zhí)行完之后再去執(zhí)行其他的線程
? ? 2.2 利用wait
代碼:
barrier:
group相關(guān)代碼:
// 全局變量group
? ? dispatch_group_t group = dispatch_group_create();
? ? // 并行隊列
? ? dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
? ? // 進入組(進入組和離開組必須成對出現(xiàn), 否則會造成死鎖)
? ? dispatch_group_enter(group);
? ? dispatch_group_async(group, queue, ^{
? ? ? ? // 執(zhí)行異步任務(wù)1
? ? ? ? [NSThread sleepForTimeInterval:2];
? ? ? ? for (int i = 0; i < 3; i ++) {
? ? ? ? ? ? NSLog(@"1---%@",[NSThread currentThread ]);? ? // 子線程
? ? ? ? }
? ? ? ? _str1 = @"str1";
? ? ? ? dispatch_group_leave(group);
? ? });
? ? // 進入組
? ? dispatch_group_enter(group);
? ? dispatch_group_async(group, queue, ^{
? ? ? ? // 執(zhí)行異步任務(wù)2
? ? ? ? [NSThread sleepForTimeInterval:2];
? ? ? ? for (int i = 3; i < 6; i ++) {
? ? ? ? ? ? NSLog(@"2---%@",[NSThread currentThread ]);
? ? ? ? }
? ? ? ? _str2 = @"str2";
? ? ? ? dispatch_group_leave(group);
? ? });
? ? // wait
? ? dispatch_group_wait(group, DISPATCH_TIME_FOREVER);
? ? dispatch_async(dispatch_get_global_queue(0, 0), ^{
? ? ? ? NSLog(@"%@", [NSThread currentThread]);
? ? ? ? _str1 = @"str..";
? ? ? ? dispatch_async(dispatch_get_main_queue(), ^{
? ? ? ? ? ? NSLog(@"%@", _str1);
? ? ? ? ? ? NSLog(@"%@", _str2);
? ? ? ? ? ? NSLog(@"%@", [NSThread currentThread]); // 主線程
? ? ? ? });
? ? });
? ? return;
? ? dispatch_group_notify(group, queue, ^{? // 監(jiān)聽組里所有線程完成的情況
? ? ? ? dispatch_async(dispatch_get_global_queue(0, 0), ^{
? ? ? ? ? NSLog(@"%@", [NSThread currentThread]);
? ? ? ? ? ? _str1 = @"str..";
? ? ? ? ? ? dispatch_async(dispatch_get_main_queue(), ^{
? ? ? ? ? ? ? ? NSLog(@"%@", _str1);
? ? ? ? ? ? ? ? NSLog(@"%@", _str2);
? ? ? ? ? ? ? ? NSLog(@"%@", [NSThread currentThread]); // 主線程
? ? ? ? ? ? ? ? NSLog(@"完成...");
? ? ? ? ? ? });
? ? ? ? });
? ? });
demo地址:https://gitee.com/liangsenliangsen/dispatch_group
本篇文章到這里就結(jié)束了,愿大家加班不多工資多,男同胞都有女朋友,女同胞都有男朋友。??