GCD初识

  • 什么是GCD
    GCD是牛逼的中枢调度器。它是纯C语言,提供了很多非常强大的函数

  • GCD的优势
    它是苹果公司为多核的并行运算提供的解决方案
    GCD会自动利用CPU的内核
    GCD会自动管理线程的生命周期(创建线程,调度线程,线程销毁)

任务和队列

GCD中的两个核心概念

  • 任务:执行什么操作
  • 队列:用于存放任务

GCD使用的两个步骤

  1. 定制任务
    确定想做的事情
  2. 将任务添加到队列中
    GCD会自动将队列中的任务取出,放到对应的线程中
    任务的取出遵循队列FIFO原则:先进先出,后进后出
执行任务
GCD初识_第1张图片
Snip20160722_4.png

同步和异步的区别:
同步:只能在当前线程中执行任务,不具备开启新线程的能力
异步:可以在新的线程中执行任务,具备开启新线程的能力

队列的两大类型
GCD初识_第2张图片
Snip20160722_5.png

代码演示

/**
 * 异步函数 + 串行队列 :会开启新的线程,但是线程是串行的,一个执行完执行下一个
 */
- (void)asyncSerial {
    
    
    // 创建串行队列
    dispatch_queue_t queue = dispatch_queue_create("com.pc.queue", DISPATCH_QUEUE_SERIAL);
    
    // 或者写NULL, NULL就是串行队列
//    dispatch_queue_t queue = dispatch_queue_create("com.pc.queue", NULL);
    
    // 2.将任务加入队列(async 异步)
    dispatch_async(queue, ^{
        
        NSLog(@"1----%@", [NSThread currentThread]);
        
    });
    
    dispatch_async(queue, ^{
        
        NSLog(@"2----%@", [NSThread currentThread]);
        
    });
    
    dispatch_async(queue, ^{
        
        NSLog(@"3----%@", [NSThread currentThread]);
        
    });

}


/**
 * 同步函数 + 并发队列 :不能开启新的线程,肯定没有并发能力
 */
- (void)syncConcurrent {
    // 获得全局的并发队列
    // 第一个参数是优先级,第二个先传0就行
    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    
    // 2.将任务加入队列(async 异步)
    dispatch_sync(queue, ^{
       
            NSLog(@"1----%@", [NSThread currentThread]);
       
    });
    
    dispatch_sync(queue, ^{
      
            NSLog(@"2----%@", [NSThread currentThread]);
       
    });
    
    dispatch_sync(queue, ^{
      
            NSLog(@"3----%@", [NSThread currentThread]);
       
    });

}

/**
 * 异步函数 + 并发队列 :可以同时开启多条线程
 */
- (void)asyncConcurrent {
    // 1.创建并发队列, 也可以不用创建
    // label 相当于队的名字  DISPATCH_QUEUE_CONCURRENT 并发
//    dispatch_queue_t queue = dispatch_queue_create("test.queue", DISPATCH_QUEUE_CONCURRENT);
    
    // 获得全局的并发队列
    // 第一个参数是优先级,第二个先传0就行
    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    
    // 2.将任务加入队列(async 异步)
    dispatch_async(queue, ^{
        for (NSInteger i = 0; i < 10; i++) {
            NSLog(@"1----%@", [NSThread currentThread]);
        }
    });
    
    dispatch_async(queue, ^{
        for (NSInteger i = 0; i < 10; i++) {
            NSLog(@"2----%@", [NSThread currentThread]);
        }
    });
    
    dispatch_async(queue, ^{
        for (NSInteger i = 0; i < 10; i++) {
            NSLog(@"3----%@", [NSThread currentThread]);
        }
    });
}


GCD初识_第3张图片
Snip20160723_1.png

你可能感兴趣的:(GCD初识)