一,线程、任务、队列,异步执行、同步执行、并行队列、串行队列都是什么鬼?
1,线程、任务、队列
线程:程序执行任务的最小调度单位
任务:简单讲就是gcd里面block块里面执行的内容
队列:用来存放任务的一个数组
2,异步执行、同步执行、并行队列、串行队列
异步执行:具备开辟一个新线程的能力,任务创建后可以先绕过,回头在执行
同步执行:不具备开辟新线程的能力,只有任务执行完后才能离开
并行队列:多个任务可以同时进行
串行队列:对个任务必须按照顺序先后进行
二,组合方式
1,多个线程一起执行–线程组
// 线程组里面可以实现多个任务同时进行,没有先后顺序
- (IBAction)createGroupQueue:(id)sender {
// 创建一个线程组
dispatch_group_t group = dispatch_group_create();
//表示:通知下面的任务马上要放到group中执行了
dispatch_group_enter(group);
/* dispatch_get_global_queue(0, 0)
// 参数1,队列优先级
// DISPATCH_QUEUE_PRIORITY_HIGH 2
// DISPATCH_QUEUE_PRIORITY_DEFAULT 0
// DISPATCH_QUEUE_PRIORITY_LOW (-2)
// DISPATCH_QUEUE_PRIORITY_BACKGROUND INT16_MIN
// 参数2,一般默认传0
*/
// 模拟多线程耗时操作
dispatch_group_async(group,dispatch_get_global_queue(0, 0), ^{
sleep(3);
NSLog(@"结束block1,当前线程:%@",[NSThread currentThread]);
// 表示:上面的任务马上要离开group了
dispatch_group_leave(group);
});
NSLog(@"结束线程1");
dispatch_group_enter(group);
// 模拟多线程耗时操作
dispatch_group_async(group,dispatch_get_global_queue(0, 0), ^{
sleep(3);
NSLog(@"结束block2,当前线程:%@",[NSThread currentThread]);
dispatch_group_leave(group);
});
NSLog(@"结束线程2");
dispatch_group_enter(group);
// 模拟多线程耗时操作
dispatch_group_async(group,dispatch_get_global_queue(0, 0), ^{
sleep(3);
NSLog(@"结束block3,当前线程:%@",[NSThread currentThread]);
dispatch_group_leave(group);
});
NSLog(@"结束线程3");
dispatch_group_notify(group, dispatch_get_global_queue(0, 0), ^{
NSLog(@"线程组结束");
});
}
注意:中间的模拟的耗时操作(第一次都是3秒)是开辟了线程组异步操作,所以任务创建了可以绕过,回来再执行。
打印结果:
2017-03-23 00:45:02.621 test[2443:60525] 结束线程1
2017-03-23 00:45:02.621 test[2443:60525] 结束线程2
2017-03-23 00:45:02.621 test[2443:60525] 结束线程3
2017-03-23 00:45:05.621 test[2443:60555] 结束block1,当前线程:{number = 3, name = (null)}
2017-03-23 00:45:05.621 test[2443:60557] 结束block2,当前线程:{number = 4, name = (null)}
2017-03-23 00:45:05.622 test[2443:60554] 结束block3,当前线程:{number = 5, name = (null)}
2017-03-23 00:45:05.622 test[2443:60554] 线程组结束
现将第二个耗时操作的睡眠时间改为5秒
打印结果:
2017-03-23 00:46:25.368 test[2472:61393] 结束线程1
2017-03-23 00:46:25.369 test[2472:61393] 结束线程2
2017-03-23 00:46:25.369 test[2472:61393] 结束线程3
2017-03-23 00:46:28.436 test[2472:61604] 结束block3,当前线程:{number = 4, name = (null)}
2017-03-23 00:46:28.436 test[2472:61603] 结束block1,当前线程:{number = 3, name = (null)}
2017-03-23 00:46:30.442 test[2472:61470] 结束block2,当前线程:{number = 5, name = (null)}
2017-03-23 00:46:30.442 test[2472:61470] 线程组结束