GCD队列的分类和举例

队列分类

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秒

你可能感兴趣的:(GCD队列的分类和举例)