GCD使用基础 一

2017-08-22  本文已影响5人  皓皓大帝

概念

串行队列:前一个执行完毕才会执行下一个。就像是只有一个窗口的收费站,轮流对车收费放行,后面的车只能等待前面的车通过,才能前行。(例:主队列)

串行队列

并行队列:后面的任务可以选择其他的途径执行。就像是有多个窗口的收费站,后面的车辆可以选择去其他的窗口排队通过。(例:全局队列)

并行队列

同步任务:执行完函数,需要等待返回结果,才可以继续往下执行,会阻塞当前线程。

异步任务:执行完函数,不需要等待返回结果,就可以继续往下执行,不会产生阻塞。

串行队列&同步任务

    dispatch_queue_t serialQueue = dispatch_queue_create("serialQueue", DISPATCH_QUEUE_SERIAL);

    dispatch_sync(serialQueue, ^{
        NSLog(@"同步任务1,%@", [NSThread currentThread]);
    });
    
    dispatch_sync(serialQueue, ^{
        NSLog(@"同步任务2,%@", [NSThread currentThread]);
    });
    
    dispatch_sync(serialQueue, ^{
        NSLog(@"同步任务3,%@", [NSThread currentThread]);
    });
串行队列&同步任务

不创建新的线程,只在当前的线程中执行,并顺序执行!

串行队列&异步任务

    dispatch_queue_t serialQueue = dispatch_queue_create("serialQueue", DISPATCH_QUEUE_SERIAL);
    dispatch_async(serialQueue, ^{
        NSLog(@"异步任务1,%@", [NSThread currentThread]);
    });
    
    dispatch_async(serialQueue, ^{
        NSLog(@"异步任务2,%@", [NSThread currentThread]);
    });
    
    dispatch_async(serialQueue, ^{
        NSLog(@"异步任务3,%@", [NSThread currentThread]);
    });
串行队列&异步任务

创建新的线程,在新的线程中执行,虽然是异步任务,仍需要按进队顺序执行。

并行队列&同步任务

    dispatch_queue_t concurrentQueue = dispatch_queue_create("concurrentQueue", DISPATCH_QUEUE_CONCURRENT);

    dispatch_sync(concurrentQueue, ^{
        NSLog(@"同步任务1,%@", [NSThread currentThread]);
    });
    
    dispatch_sync(concurrentQueue, ^{
        NSLog(@"同步任务2,%@",[NSThread currentThread]);
    });
    
    dispatch_sync(concurrentQueue, ^{
        NSLog(@"同步任务3,%@",[NSThread currentThread]);
    });
并行队列&同步任务

不创建新的线程,在当前线程执行,虽然是并行队列,由于同步任务的阻塞性,仍是按进队顺序执行。

并行队列&异步任务

    dispatch_queue_t concurrentQueue = dispatch_queue_create("concurrentQueue", DISPATCH_QUEUE_CONCURRENT);

    dispatch_async(concurrentQueue, ^{
        NSLog(@"异步任务1,%@", [NSThread currentThread]);
    });
    
    dispatch_async(concurrentQueue, ^{
        NSLog(@"异步任务2,%@",[NSThread currentThread]);
    });
    
    dispatch_async(concurrentQueue, ^{
        NSLog(@"异步任务3,%@",[NSThread currentThread]);
    });
并行队列&异步任务

创建新的线程执行任务,而且是并行队列,所以任务的执行相互不影响,谁先执行完毕,算谁厉害!

注释:

    dispatch_async(concurrentQueue, ^{
        NSLog(@"异步任务1,%@", [NSThread currentThread]);
        dispatch_async(concurrentQueue, ^{
            NSLog(@"同步任务1,%@", [NSThread currentThread]);
        });
    });

    dispatch_sync(concurrentQueue, ^{
        NSLog(@"同步任务2,%@",[NSThread currentThread]);
    });
注释1

上面的内容都是自己学习时的理解,也通过这种方式作为日记,欢迎大神来教育!

上一篇下一篇

猜你喜欢

热点阅读