队列分类
1.主队列
dispatch_get_main_queue();//主队列
2.串行队列
dispatch_queue_t queen = dispatch_queue_create("11", DISPATCH_QUEUE_SERIAL);//串行队列
3.并发队列
dispatch_queue_t queen = dispatch_queue_create("22", DISPATCH_QUEUE_CONCURRENT);//并发队列
4.全局队列
dispatch_queue_t queen = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);//全局队列
任务分类
1.同步 dispatch_sync
2.异步 dispatch_async
两者结合
1.串行同步:队列会按顺序来调度任务,任务在一个线程里运行,one by one
2.并行同步:即使不会等待一个任务执行完毕便再次调度下一个任务(调度任务,不控制任务的执行),但同步任务不会开启新的线程,one by one
3.串行异步:按顺序来调度任务,任务会创建新的线程,one by one
4.并行异步:操作会新建多个线程(有多少任务,就开n个线程执行)、操作无序执行;不会强制来等待上一个任务执行完毕,而是会在有空闲线程时来继续调度下一个任务,而此时任务会创建新的线程来执行,故这种组合可以实现任务的并发
5.全局异步:操作会新建多个线程、操作无序执行
6.全局同步:操作不会新建线程、操作顺序执行
7.主队列异步:操作都应该在主线程上顺序执行的,不存在异步的概念
8.主队列同步:如果把主线程中的操作看成一个大的block,那么除非主线程被用户杀掉,否则永远不会结束;主队列中添加的同步操作永远不会被执行,会死锁
串行同/异步举例
dispatch_queue_t queen = dispatch_queue_create("11", NULL);//串行队列
dispatch_async(queen, ^{
sleep(2);
NSLog(@"1");
});
dispatch_async(queen, ^{
sleep(1);
NSLog(@"2");
});
NSLog(@"4");
dispatch_sync(queen, ^{ //同步需要等
sleep(1);
NSLog(@"3");
});
NSLog(@"5");
// 结果:41235 耗时:4秒
并行同/异步举例
dispatch_queue_t queen2 = dispatch_queue_create("22", DISPATCH_QUEUE_CONCURRENT);//并发队列
dispatch_async(queen2, ^{
dispatch_async(queen2, ^{
sleep(2);
NSLog(@"2");
});
NSLog(@"1");
dispatch_async(queen2, ^{
NSLog(@"3");
dispatch_async(queen2, ^{
sleep(2);
NSLog(@"4");
});
dispatch_async(queen2, ^{
NSLog(@"5");
});
});
});
sleep(1);
// 结果:135 24(随机顺序) 耗时:2秒
主队列异步举例
dispatch_queue_t queen2 = dispatch_get_main_queue();//主队列
dispatch_async(queen2, ^{
dispatch_async(queen2, ^{
sleep(2);
NSLog(@"2");
});
NSLog(@"1");
dispatch_async(queen2, ^{
NSLog(@"3");
dispatch_async(queen2, ^{
sleep(2);
NSLog(@"4");
});
dispatch_async(queen2, ^{
NSLog(@"5");
});
});
});
sleep(1);
// 结果:13254 耗时:4秒
全局异步举例
dispatch_queue_t queen2 = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);//全局
dispatch_async(queen2, ^{
dispatch_async(queen2, ^{
sleep(2);
NSLog(@"2");
});
NSLog(@"1");
dispatch_async(queen2, ^{
NSLog(@"3");
dispatch_async(queen2, ^{
sleep(2);
NSLog(@"4");
});
dispatch_async(queen2, ^{
NSLog(@"5");
});
});
});
sleep(1);
// 结果:135 24(随机顺序) 耗时:2秒