美文网首页
GCD(Grand Central Dispatch) 多线程

GCD(Grand Central Dispatch) 多线程

作者: 9bf19a4010ab | 来源:发表于2016-08-19 07:36 被阅读14次

    首先简单的了解一下GCD 它是Apple开发的一种解决多核编程的方法 之前我介绍过系统中提供的NSThread来创建运用多线程 在iOS开发中 我们较多的用GCD来解决多线程中的问题
    我们把只有一个主线程的的程序称为单线程程序 单线程中主线程负责所有代码的(UI展示 网络请求 本地存储)执行 '而且所有代码只能顺序执行 不能并发执行 在实际开发中 我们为了程序的高效执行我们会创建多个子线程 这些子线程和主线程是彼此独立的单元 互不影响 并发执行 从而提高程序的执行效率

    // 线程分为同步线程 异步线程
    // 队列的创建: 串行队列 并发队列 主队列 全局队列(其中串行队列 并发队列是我们自定义的队列)
    // 下面 我们将线程分为同步和异步两个部分来考虑

    // 创建4个队列(串行队列 并发队列 主队列 全局队列)
    
    // 创建串行队列
    dispatch_queue_t serialQueue = dispatch_queue_create("serial", DISPATCH_QUEUE_SERIAL);
    // 创建并发队列
    dispatch_queue_t conCurrentQueue = dispatch_queue_create(0, DISPATCH_QUEUE_CONCURRENT);
    // 创建主队列
    dispatch_queue_t mainQueue = dispatch_get_main_queue();
    // 创建全局队列
    dispatch_queue_t globalQueue = dispatch_get_global_queue(0, 0);
    
    // 同步线程(对四种不同的队列进行分析)
    //    [self syncSerialQueue:serialQueue];
    //    [self syncConCurrent:conCurrentQueue];
    //    [self syncMainQueue:mainQueue];
    //    [self syncGlobalQueue:globalQueue];
    
    // 异步线程(对四种不同的队列进行分析)
    //    [self asyncSerialQueue: serialQueue];
    //    [self asyncConCurrentQueue:conCurrentQueue];
    //    [self asyncMainQueue:mainQueue];
    //    [self asyncGlobalQueue:globalQueue];
    
    // 总结 同步线程 无论是那种队列 都不会创建新的线程 都是在主线程中 注意相同线程不能同步相同线程 在iOS9.0会导致停止执行之后的程序 在iOS10.0会导致程序crush
    // 串行: 一个任务执行完毕 再执行下一个任务
    
    
    
    - (void)syncSerialQueue:(dispatch_queue_t)queue {
    NSLog(@"同步串行队列");
    for (int i = 0; i < 5; i++) {
        dispatch_sync(queue, ^{
            NSLog(@"%d-----%@", i, [NSThread currentThread]);
        });
    }
    }
    
    - (void)syncConCurrent:(dispatch_queue_t)queue {
    NSLog(@"同步并发队列");
    for (int i = 0; i < 5 ; i++) {
        dispatch_sync(queue, ^{
            NSLog(@"%d----- %@", i, [NSThread currentThread]);
        });
    }
    }
    
    - (void)syncMainQueue:(dispatch_queue_t)queue {
    NSLog(@"主队列");
    for (int i = 0; i < 5; i++) {
        dispatch_sync(queue, ^{
            NSLog(@"%d----- %@", i, [NSThread currentThread]);
        });
    }
    }
    
    - (void)syncGlobalQueue:(dispatch_queue_t)queue {
    NSLog(@"同步全局队列");
    for (int i = 0; i < 5; i++) {
        dispatch_sync(queue, ^{
            NSLog(@"%d-----%@", i, [NSThread currentThread]);
        });
    }
    }
    
    // ----------------------------- 异步 -----------------------
    - (void)asyncSerialQueue:(dispatch_queue_t)queue {
    NSLog(@"异步并发队列");
    dispatch_async(queue, ^{
        NSLog(@"%d-----%@", 1, [NSThread currentThread]);
    });
    dispatch_async(queue, ^{
        NSLog(@"%d-----%@", 2, [NSThread currentThread]);
    });
    dispatch_async(queue, ^{
        NSLog(@"%d-----%@", 3, [NSThread currentThread]);
    });
    dispatch_async(queue, ^{
        NSLog(@"%d-----%@", 4, [NSThread currentThread]);
    });
    dispatch_async(queue, ^{
        NSLog(@"%d-----%@", 5, [NSThread currentThread]);
    });
    }
    - (void)asyncConCurrentQueue:  (dispatch_queue_t)queue {
    NSLog(@"异步并发队列");
    //        dispatch_async(queue, ^{
    //            NSLog(@"%d-----%@", 1, [NSThread currentThread]);
    //        });
    //    dispatch_async(queue, ^{
    //        NSLog(@"%d-----%@", 2, [NSThread currentThread]);
    //    });
    //    dispatch_async(queue, ^{
    //        NSLog(@"%d-----%@", 3, [NSThread currentThread]);
    //    });
    //    dispatch_async(queue, ^{
    //        NSLog(@"%d-----%@", 4, [NSThread currentThread]);
    //    });
    //    dispatch_async(queue, ^{
    //        NSLog(@"%d-----%@", 5, [NSThread currentThread]);
    //    });
    for (int i = 0; i < 5; i++) {
        dispatch_async(queue, ^{
            NSLog(@"%d-----%@", i, [NSThread currentThread]);
        });
    }
    
    
    }
    
    - (void)asyncMainQueue:(dispatch_queue_t)queue {
    NSLog(@"异步主队列");
    for (int i = 0; i < 5; i++) {
        dispatch_async(queue, ^{
            NSLog(@"%d-----%@", i, [NSThread currentThread]);
        });
    }
    }
    
    - (void)asyncGlobalQueue:(dispatch_queue_t)queue   {
    NSLog(@"异步全局队列");
    for (int i = 0; i < 5; i++) {
        dispatch_async(queue, ^{
            NSLog(@"%d-----%@", i, [NSThread currentThread]);
        });
    }
    }
    

    相关文章

      网友评论

          本文标题:GCD(Grand Central Dispatch) 多线程

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