美文网首页iOS
iOS 同步、异步、串行、并发(并行)学习

iOS 同步、异步、串行、并发(并行)学习

作者: EngineerPan | 来源:发表于2020-04-04 17:06 被阅读0次

    队列优先级

    DISPATCH_QUEUE_PRIORITY_HIGH 2                  // 优先级高
    DISPATCH_QUEUE_PRIORITY_DEFAULT 0               // 优先级中
    DISPATCH_QUEUE_PRIORITY_LOW (-2)                // 优先级低
    DISPATCH_QUEUE_PRIORITY_BACKGROUND INT16_MIN    // 后台任务优先级
    

    队列类型

    // 串行队列
    DISPATCH_QUEUE_SERIAL   
    
    // 并发队列
    DISPATCH_QUEUE_CONCURRENT
    

    队列创建方式

    • 串行队列
    // 默认优先级的串行队列
    dispatch_queue_t serialQueue = dispatch_queue_create(DISPATCH_QUEUE_PRIORITY_DEFAULT, DISPATCH_QUEUE_SERIAL);
    
    // 主队列
    dispatch_queue_t serialQueue = dispatch_get_main_queue();
    
    • 并行(并发)队列
    // 默认优先级的并行队列
    dispatch_queue_t conCurrentQueue = dispatch_queue_create(DISPATCH_QUEUE_PRIORITY_DEFAULT, DISPATCH_QUEUE_CONCURRENT);
    
    // 全局队列
    dispatch_queue_t globalQueue = dispatch_get_global_queue(0, 0);
    

    同步函数和异步函数决定了要不要创建新的线程;
    同步函数:在当前线程中执行队列里面的任务,不具备开启线程的能力;
    异步函数:在新的线程中执行队列里面的任务,具备开启线程的能力;

    串行和并行决定了任务的执行方式
    串行:一个任务执行完毕后,再执行下一个任务;
    并行:多个任务并行执行;

    注意:同步执行队列任务,不管是串行还是并行队列,任务都是顺序执行的;

    1. 同步执行串行任务(不会创建新线程(在主线程中执行),任务顺序执行)
    dispatch_queue_t serialQueue = dispatch_queue_create(DISPATCH_QUEUE_PRIORITY_DEFAULT, DISPATCH_QUEUE_SERIAL);
    
    /// 任务1
    dispatch_sync(serialQueue, ^{
        NSLog(@"同步执行串行队列任务1----当前线程:%@", [NSThread currentThread]);
    });
    
    /// 任务2
    dispatch_sync(serialQueue, ^{
        NSLog(@"同步执行串行队列任务2----当前线程:%@", [NSThread currentThread]);
    });
    
    1. 同步执行串行(主队列)任务(死锁,主线程和主队列互相等待)
    dispatch_queue_t mainQueue = dispatch_get_main_queue();
        
    /// 任务1
    dispatch_sync(mainQueue, ^{
        NSLog(@"同步执行主队列任务1----当前线程:%@", [NSThread currentThread]);
    });
        
    /// 任务2
    dispatch_sync(mainQueue, ^{
        NSLog(@"同步执行主队列任务2----当前线程:%@", [NSThread currentThread]);
    });
    
    1. 同步执行并发任务(不会创建新线程(在主线程中执行),任务顺序执行)
    dispatch_queue_t conCurrentQueue = dispatch_queue_create(DISPATCH_QUEUE_PRIORITY_DEFAULT, DISPATCH_QUEUE_CONCURRENT);
    
    /// 任务1
    dispatch_sync(conCurrentQueue, ^{
        NSLog(@"同步执行并发任务1----当前线程:%@", [NSThread currentThread]);
    });
    
    /// 任务2
    dispatch_sync(conCurrentQueue, ^{
        NSLog(@"同步执行并发任务2----当前线程:%@", [NSThread currentThread]);
    });
    
    1. 同步执行并发(全局队列)任务(不会创建新线程,任务顺序执行)
    dispatch_queue_t globalQueue = dispatch_get_global_queue(0, 0);
    
    /// 任务1
    dispatch_sync(globalQueue, ^{
        NSLog(@"同步执行全局队列任务1----当前线程:%@", [NSThread currentThread]);
    });
    
    /// 任务2
    dispatch_sync(globalQueue, ^{
        NSLog(@"同步执行全局队列任务2----当前线程:%@", [NSThread currentThread]);
    });
    
    1. 异步执行串行任务(创建新线程,任务顺序执行)
    dispatch_queue_t serialQueue = dispatch_queue_create(DISPATCH_QUEUE_PRIORITY_DEFAULT, DISPATCH_QUEUE_SERIAL);
    
    /// 任务1
    dispatch_async(serialQueue, ^{
        NSLog(@"异步执行串行队列任务1----当前线程:%@", [NSThread currentThread]);
    });
    
    /// 任务2
    dispatch_async(serialQueue, ^{
        NSLog(@"异步执行串行队列任务2----当前线程:%@", [NSThread currentThread]);
    });
    
    1. 异步执行串行(主队列)任务(不会创建新线程,任务顺序执行)
    dispatch_queue_t mainQueue = dispatch_get_main_queue();
    
    /// 任务1
    dispatch_async(mainQueue, ^{
        NSLog(@"异步执行主队列任务1----当前线程:%@", [NSThread currentThread]);
    });
    
    /// 任务2
    dispatch_async(mainQueue, ^{
        NSLog(@"异步执行主队列任务2----当前线程:%@", [NSThread currentThread]);
    });
    
    1. 异步执行并发队列任务(会创建新线程,任务无序执行)
    dispatch_queue_t conCurrentQueue = dispatch_queue_create(DISPATCH_QUEUE_PRIORITY_DEFAULT, DISPATCH_QUEUE_CONCURRENT);
    
    /// 任务1
    dispatch_async(conCurrentQueue, ^{
        NSLog(@"异步执行并发队列任务1----当前线程:%@", [NSThread currentThread]);
    });
    
    /// 任务2
    dispatch_async(conCurrentQueue, ^{
        NSLog(@"异步执行并发队列任务2----当前线程:%@", [NSThread currentThread]);
    });
    
    1. 异步执行并发(全局)队列任务(会创建新线程,任务无序执行)
    dispatch_queue_t globalQueue = dispatch_get_global_queue(0, 0);
    
    /// 任务1
    dispatch_async(globalQueue, ^{
        NSLog(@"异步执行全局并发队列任务1----当前线程:%@", [NSThread currentThread]);
    });
    
    /// 任务2
    dispatch_async(globalQueue, ^{
        NSLog(@"异步执行全局并发队列任务2----当前线程:%@", [NSThread currentThread]);
    });
    

    相关文章

      网友评论

        本文标题:iOS 同步、异步、串行、并发(并行)学习

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