一、 同步/异步、串行/并行的区别
1.同步/异步
同步/异步是指线程与线程之间的关系.
2.串行/并行
串行/并行是指队列内部任务与任务之间的关系.
如果是串行队列,那么队列内部的任务是按顺序执行的.
如果是并行队列, 那么队列内部的任务执行是无序的, 没有先后顺序.
二、 线程与队列
1. 线程
//同步线程
dispatch_sync(<#dispatch_queue_t queue#>, <#^(void)block#>)
//异步线程
dispatch_async(<#dispatch_queue_t queue#>, <#^(void)block#>)
2. 队列
//创建一个串行队列
dispatch_queue_t queue = dispatch_queue_create("label", DISPATCH_QUEUE_SERIAL);
//创建一个并行队列
dispatch_queue_t queue = dispatch_queue_create("label", DISPATCH_QUEUE_CONCURRENT);
//获取全局队列, 全局队列是并行的
dispatch_queue_t queue = dispatch_get_global_queue(0, 0);
//获取主线程的队列, 主线程队列是串行的
dispatch_queue_t queue = dispatch_get_main_queue();
三、几种常见的任务处理方式
1. 异步串行队列
dispatch_queue_t queue = dispatch_queue_create("queue", DISPATCH_QUEUE_SERIAL);
for (int i = 0; i < 10; i++) {
dispatch_async(queue, ^{
NSLog(@"------- %d", i);
});
}
队列中所有任务在异步线程中按顺序执行, 结果如下:
异步串行队列2. 异步并行队列
dispatch_queue_t queue = dispatch_queue_create("queue", DISPATCH_QUEUE_CONCURRENT);
for (int i = 0; i < 10; i++) {
dispatch_async(queue, ^{
NSLog(@"------- %d", i);
});
}
队列中所有任务在异步线程并行执行, 无先后顺序, 结果如下:
异步并行队列3. 异步串行队列, 并在任务完成后进行通知
dispatch_group_t group = dispatch_group_create();
dispatch_queue_t queue = dispatch_queue_create("queue", DISPATCH_QUEUE_SERIAL);
for (int i = 0; i < 10; i++) {
dispatch_group_async(group, queue, ^{
NSLog(@"------- %d", i);
});
}
dispatch_group_notify(group, queue, ^{
NSLog(@"任务执行完毕!");
});
运行结果如下:
异步串行队列, 并在任务完成后进行通知4. 异步并行队列, 并在任务完成后进行通知
dispatch_group_t group = dispatch_group_create();
dispatch_queue_t queue = dispatch_queue_create("queue", DISPATCH_QUEUE_CONCURRENT);
for (int i = 0; i < 10; i++) {
dispatch_group_async(group, queue, ^{
NSLog(@"------- %d", i);
});
}
dispatch_group_notify(group, queue, ^{
NSLog(@"任务执行完毕!");
});
结果如下:
异步并行队列, 并在任务完成后进行通知
网友评论