iOS GCD 学习

GCD 优势: 

1. 可以用在多核并行运算

2. 自动利用更多的CPU内核

3. 自动管理线程的生命周期

任务:

  GCD里的操作,分为同步执行(sync)和异步执行(async), 一般使用async,开辟了一个新线程执行任务


队列:

存放任务的队列,一种特殊的线性表,遵从FIFO原则,分为并行队列串行队列

并行队列: Concurrent Dispatch Queue,让多个任务同时执行 ; 会自动开启多个线程能同时执行任务,只在异步执行才有效

串行队列: Serial Dispatch Queue,任务一个一个执行

GCD的使用: 创建任务,确定要做的事,将任务添加到队列;

在学习的过程中写了结果Demo,加深印象  :

//串行队列 + 同步任务
/**
    不开线程
    有序执行
 */

- (void)GCDDemo1{
    /**
        创建串行队列
        参数1: 队列的标识符
        参数2: 队列的属性,决定了队列是串行的还是并行的
        DISPATCH_QUEUE_SERIAL: 串行队列
     */
    dispatch_queue_t queue = dispatch_queue_create("GL", DISPATCH_QUEUE_SERIAL);
    
    for (NSInteger i = 0; i < 10; i ++) {
        dispatch_sync(queue, ^{
            NSLog(@"%zd %@",i, [NSThread currentThread]);
        });
    }
    
    NSLog(@"串行队列要一个一个执行完之后,才会执行这一句");
}


//串行队列 + 异步任务
- (void)GCDDemo2{
    dispatch_queue_t queue = dispatch_queue_create("GL", DISPATCH_QUEUE_SERIAL);
    
    for (NSInteger i = 0; i < 10; i ++) {
        dispatch_async(queue, ^{
            NSLog(@"%zd %@",i,[NSThread mainThread]);
        });
    }
    
    NSLog(@"先执行这一句,在执行之上的异步任务");
}


//并行队列 + 同步任务
/**
     不开线程
     有序执行
 */

- (void)GCDDemo3{
    //创建并行队列
    //DISPATCH_QUEUE_CONCURRENT: 并行队列
    //并行队列只能决定"是否"可以同时调度多个任务; 不能决定开不开线程
    dispatch_queue_t queue = dispatch_queue_create("GL", DISPATCH_QUEUE_CONCURRENT);
    for (NSInteger i = 0; i < 10; i ++) {
        dispatch_sync(queue, ^{
            NSLog(@"%zd %@",i,[NSThread mainThread]);
        });
    }
    
    NSLog(@"并行队列可以同时调度多个任务, 但是由于是同步任务,也只能是一个一个有序执行");
}

/**
     并行队列 + 异步任务
 */
- (void)GCDDemo4{
    //并行队列
    dispatch_queue_t queue = dispatch_queue_create("GL", DISPATCH_QUEUE_CONCURRENT);
    //异步任务
    for (NSInteger i = 0; i < 10; i ++) {
        dispatch_async(queue, ^{
            NSLog(@"%zd  %@",i,[NSThread mainThread]);
        });
    }
    NSLog(@"并行队列 + 异步任务 导致 任务执行没有顺序");
}

/**
     死锁
 */
- (void)GCDDemo5{
    NSLog(@"1");
    //这种写法直接导致死锁
    /*
    dispatch_sync(dispatch_get_main_queue(), ^{
        NSLog(@"2");
    });
     */
    
    dispatch_async(dispatch_get_main_queue(), ^{
        NSLog(@"2");
    });
    NSLog(@"3");
} 


最后一个死循环是在一篇博客上看到的, 作者解释的原因是任务3与任务2 在相互等待,所以造成死锁; 但是我直接写成:

/**
     死循环
 */
- (void)GCDDemo5{
    dispatch_sync(dispatch_get_main_queue(), ^{
        NSLog(@"2");
    });
}
这样子,也是死循环; 

具体的原因我还不是很明白, 诸位若是能解惑,不胜感谢.

以上的Demo是学习这篇博客:  点击打开链接 . 



 

猜你喜欢

转载自blog.csdn.net/xfy6238/article/details/77980651