美文网首页
GCD使用基础 一

GCD使用基础 一

作者: 皓皓大帝 | 来源:发表于2017-08-22 18:33 被阅读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]);
        });
    
    并行队列&异步任务

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

    注释:

    • 当前线程
      上面说的当前线程指的是添加任务时所在的线程,不一定是在主线程(main)中,直接看代码!下面的异步任务1同步任务1就是在同一个子线程中执行的。
        dispatch_async(concurrentQueue, ^{
            NSLog(@"异步任务1,%@", [NSThread currentThread]);
            dispatch_async(concurrentQueue, ^{
                NSLog(@"同步任务1,%@", [NSThread currentThread]);
            });
        });
    
        dispatch_sync(concurrentQueue, ^{
            NSLog(@"同步任务2,%@",[NSThread currentThread]);
        });
    
    注释1
    • 线程数(number)
      虽然异步任务会创建新的线程,但并不是有多少异步任务就会创建多少条线程,很费电的!系统会做限制的,我们也可以根据不同的网络环境对线程数量进行限制。
      上面的打印日志中,number的值不是当前存在的线程数,而是曾经创建过这么多线程,而这个任务是在这条线程执行的。线程会在其上面的任务执行完毕后销毁的,这个跟runloop就挂钩了!

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

    相关文章

      网友评论

          本文标题:GCD使用基础 一

          本文链接:https://www.haomeiwen.com/subject/ziildxtx.html