美文网首页
七、GCD与多线程

七、GCD与多线程

作者: faterman | 来源:发表于2018-01-31 15:56 被阅读7次

队列与任务的组合

在多线程开发中我们经常会遇到这些概念:并发队列、串行队列、同步任务、异步任务。我们将这四个概念进行组合会有四种结果:串行队列+同步任务、串行队列+异步任务、并发队列+同步任务、并发队列+异步任务。我们对这四种结果进行解释:

  1. 串行队列+同步任务:不会开启新的线程,任务逐步完成。

  2. 串行队列+异步任务:开启新的线程,任务逐步完成。

  3. 并发队列+同步任务:不会开启新的线程,任务逐步完成。

  4. 并发队列+异步任务:开启新的线程,任务同步完成。

我们如果要让任务在新的线程中完成,应该使用异步线程。为了提高效率,我们还应该将任务放在并发队列中。因此在开发中使用最多的是并发队列+异步任务。看代码:

// 串行队列+同步任务:不会开启新的线程,任务逐步完成

- (void)serialSyn{
    
    dispatch_queue_t queue =dispatch_queue_create("serial",DISPATCH_QUEUE_SERIAL);
    
    dispatch_sync(queue, ^{
        
        for (int i =0; i <3; i ++) {
            
            NSLog(@"1---%@", [NSThread currentThread]);
            
        }
        
    });
    
    dispatch_sync(queue, ^{
        
        for (int i =0; i <3; i ++) {
            
            NSLog(@"2---%@", [NSThread currentThread]);
            
        }
        
    });
    
    dispatch_sync(queue, ^{
        
        for (int i =0; i <3; i ++) {
            
            NSLog(@"3---%@", [NSThread currentThread]);
            
        }
        
    });
    
}

// 串行队列+异步任务 开启新的线程,任务逐步完成

- (void)serialAsyn{
    
    dispatch_queue_t queue =dispatch_queue_create("serial",DISPATCH_QUEUE_SERIAL);
    
    dispatch_async(queue, ^{
        
        for (int i =0; i <3; i ++) {
            
            NSLog(@"1---%@", [NSThread currentThread]);
            
        }
        
    });
    
    dispatch_async(queue, ^{
        
        for (int i =0; i <3; i ++) {
            
            NSLog(@"2---%@", [NSThread currentThread]);
            
        }
        
    });
    
    dispatch_async(queue, ^{
        
        for (int i =0; i <3; i ++) {
            
            NSLog(@"3---%@", [NSThread currentThread]);
            
        }
        
    });
    
}

// 并发队列+同步任务 不会开启新的线程,任务逐步完成。

- (void)concurrenSyn{
    
    dispatch_queue_t queue =dispatch_queue_create("concurrent",DISPATCH_QUEUE_CONCURRENT);
    
    dispatch_sync(queue, ^{
        
        for (int i =0; i <3; i ++) {
            
            NSLog(@"1---%@", [NSThread currentThread]);
            
        }
        
    });
    
    dispatch_sync(queue, ^{
        
        for (int i =0; i <3; i ++) {
            
            NSLog(@"2---%@", [NSThread currentThread]);
            
        }
        
    });
    
    dispatch_sync(queue, ^{
        
        for (int i =0; i <3; i ++) {
            
            NSLog(@"3---%@", [NSThread currentThread]);
            
        }
        
    });
    
    
    
}

// 并发队列+异步任务 开启新的线程,任务同步完成。

- (void)concurrentAsyn{
    
    dispatch_queue_t queue =dispatch_queue_create("concurrent",DISPATCH_QUEUE_SERIAL);
    
    dispatch_async(queue, ^{
        
        for (int i =0; i <3; i ++) {
            
            NSLog(@"1---%@", [NSThread currentThread]);
            
        }
        
    });
    
    dispatch_async(queue, ^{
        
        for (int i =0; i <3; i ++) {
            
            NSLog(@"2---%@", [NSThread currentThread]);
            
        }
        
    });
    
    dispatch_async(queue, ^{
        
        for (int i =0; i <3; i ++) {
            
            NSLog(@"3---%@", [NSThread currentThread]);
            
        }
        
    });
    
}
image.png

一个问题引发的论述

下面代码仅打印1,并且会造成线程死锁。

- (void)viewDidLoad {

    [super viewDidLoad];

    // Do any additional setup after loading the view, typically from a nib.

    NSLog(@"===========1");

    dispatch_sync(dispatch_get_main_queue(), ^{

       NSLog(@"===========2");

    });

    NSLog(@"===========3");
}

问题及概念解释

相关文章

  • iOS面试之多线程模块

    多线程 多线程内容如下: GCD NSOperation NSThread 多线程与锁 1.GCD 同步/异步和串...

  • iOS面试之多线程大全

    多线程 多线程内容如下: GCD NSOperation NSThread 多线程与锁 1.GCD 作为一个开发者...

  • [iOS面试]第6章 多线程相关面试问题

    本文主讲多线程相关面试问题:包括GCD、NSOperation、NSThread、多线程与锁。 一、GCD 同步/...

  • 7.3 多线程-GCD

    多线程-GCD 多线程-GCD-串行并行 多线程-GCD.png GCD-线程的通讯、延时操作、定时器 GCD-线...

  • ios面试题

    runtime介绍 runLoop与多线程关系 多线程原理(GCD、NSOperation) AFNetworki...

  • 多线程

    ios中为我们提供了GCD、NSOpration、NSThread 一、GCD多线程与锁GCD 同步异步、串行、并...

  • 多线程

    GCD NSOperation NSThread 多线程与锁 一、GCD 同步、异步 和 串行、并发 dispat...

  • 七、GCD与多线程

    队列与任务的组合 在多线程开发中我们经常会遇到这些概念:并发队列、串行队列、同步任务、异步任务。我们将这四个概念进...

  • iOS多线程:『GCD』详尽总结

    iOS多线程:『GCD』详尽总结 iOS多线程:『GCD』详尽总结

  • iOS多线程之NSOperations

    相关文章:iOS多线程之NSThreadiOS多线程之GCD NSOperation(任务)与NSOperatio...

网友评论

      本文标题:七、GCD与多线程

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