iOS多线程方案
image.png
同步、异步、并发、串行
同步
:在当前线程中执行任务,不具备开启新线程
的能力。
注意:需要立马在当前线程
执行任务,执行完毕后才能继续往下执行
异步
:在新的线程中执行任务,具备开启新线程
的能力(但不一定都会开启新线程,比如在主队列中,因为主队列中的每个任务都必须是在主线程中执行的)
注意:不要求立马执行
并发和串行主要影响:
任务的执行方式
并发
:多个任务并发(同时
)执行
串行
:一个任务执行完毕后,在执行下一个任务
/// 创建一个串行队列
dispatch_queue_t queue = dispatch_queue_create("my_queue", DISPATCH_QUEUE_SERIAL);
/// 创建一个并发队列
dispatch_queue_t asyncQueue = dispatch_queue_create("async_queue", DISPATCH_QUEUE_CONCURRENT);
/// 获取全局队列(也是一个并发队列)
dispatch_queue_t globalQueue = dispatch_get_global_queue(0, 0);
/// 获获取主队列(主队列也是一个特殊的串行队列,因为主队列的任务是不会开启新的子线程执行的,都必须在主队列中执行)
dispatch_queue_t mainQueue = dispatch_get_main_queue();
/// 同步任务
/// 任务1
dispatch_async(asyncQueue, ^{
for (int i=0; i<5; i++) {
NSLog(@"执行任务1 %d:%@",i,[NSThread currentThread]);
}
});
/// 同步任务
/// 任务2
dispatch_async(asyncQueue, ^{
for (int i=0; i<5; i++) {
NSLog(@"执行任务2 %d:%@",i,[NSThread currentThread]);
}
});
[图片上传失败...(image-9705ca-1602519329137)]
# 以下代码会产生死锁
#提醒:线程的任务是指代码块,都是以中括号{}为准,比如此处主队列总共有两个任务:
任务1:viewDidLoad{}
任务2:dispatch_sync{}
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
NSLog(@"打印1");
/// 队列的特点:排队,FIFO,First In First Out 先进先出
dispatch_queue_t queue = dispatch_get_main_queue();
dispatch_sync(queue, ^{
NSLog(@"打印2");
});
/// dispatch_sync : 立马在当前线程执行任务,执行完毕后才能继续往下执行
NSLog(@"打印3");
}
@end
# 也是会产生死锁:因为在子串行队列中,添加了同步任务
打印结果是:1 5 2 崩溃
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
NSLog(@"打印1");
dispatch_queue_t queue = dispatch_queue_create("my_queue", DISPATCH_QUEUE_SERIAL);
dispatch_async(queue, ^{
NSLog(@"打印2");
dispatch_sync(queue, ^{
NSLog(@"打印3");
});
NSLog(@"打印4");
});
NSLog(@"打印5");
}
@end
# 换成这种写法不会产生死锁,因为my_queue是并发队列,那么也就是说队列里的任务是可以同时执行的,
# 不需要等待一个任务执行完成后才去执行另外一个任务
打印结果:1 5 2 3 4
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
NSLog(@"打印1 %@",[NSThread currentThread]);
dispatch_queue_t queue = dispatch_queue_create("my_queue", DISPATCH_QUEUE_CONCURRENT);
dispatch_async(queue, ^{ /// my_queue队列:任务1
NSLog(@"打印2 %@",[NSThread currentThread]);
dispatch_sync(queue, ^{ /// my_queue队列:任务2
NSLog(@"打印3 %@",[NSThread currentThread]);
});
NSLog(@"打印4 %@",[NSThread currentThread]);
});
NSLog(@"打印5 %@",[NSThread currentThread]);
}
@end
网友评论