多线程多任务顺序执行
程序员文章站
2022-05-05 21:37:02
...
ios开发中会用到多任务顺序执行,执行完毕在执行其他的线程任务,在面试中也会经常被问到,我这里就将方法代码记录下来作为一个笔记
我这里将通过信号量和GCD的Group实现多任务顺序执行
1.通过信号量来实现
//通过模拟一个网络请求来实现一个有返回值的网络请求任务
NSString *str = @"https://www.baidu.com";
NSURL *url = [NSURL URLWithString:str];
NSURLRequest *request = [NSURLRequest requestWithURL:url];
NSURLSession *session = [NSURLSession sharedSession];
dispatch_semaphore_t sem = dispatch_semaphore_create(0); //创建信号量为0
//模拟执行10个线程任务
for (int i = 0; i < 10; i++) {
NSURLSessionDataTask *task = [session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
NSLog(@"%d",i);
dispatch_semaphore_signal(sem); 信号量加一
}];
[task resume];
dispatch_semaphore_wait(sem,DISPATCH_TIME_FOREVER); //这个代表信号量减一
}
//信号量只有在为0时才会继续执行下一步
dispatch_async(dispatch_get_main_queue(), ^{
NSLog(@"end");
});
看一下控制台结果
通过打印看到线程是顺序执行的
2.使用Group实现
NSString *str = @"https://www.baidu.com";
NSURL *url = [NSURL URLWithString:str];
NSURLRequest *request = [NSURLRequest requestWithURL:url];
NSURLSession *session = [NSURLSession sharedSession];
dispatch_queue_t queue = dispatch_queue_create("label", NULL);
dispatch_group_t group = dispatch_group_create();
for (int i = 0; i < 10; i++) {
dispatch_group_enter(group); //标志进入
NSURLSessionDataTask *task = [session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
NSLog(@"%d",i);
dispatch_group_leave(group);//标志执行完离开
}];
[task resume];
}
//group中线程执行完成,通知执行下一步
dispatch_group_notify(group, queue, ^{
NSLog(@"end");
});
这个group不一定会顺序执行,会在任务执行完成后才会执行dispatch_group_notify中的任务
上一篇: 多线程执行顺序及控制顺序
下一篇: 如何改变 Python 中线程的执行顺序