同步 异步 串行 并发

作者: foolish_hungry | 来源:发表于2018-06-19 22:45 被阅读0次

串行队列
添加在队列的任务, 都是按添加顺序先后执行的, 就是所谓的先进先出(FIFO)原则. 我们的主队列就是串行队列, 程序代码按顺序执行. 所以一个串行队列只需要一个线程.

并发队列
添加在该队列中的任务, 会在开启新线程时同时执行, 不开启新线程时, 无法同时执行任务, 就不能实现并发.

同步
任务都在当前线程执行, 执行过程会阻塞当前线程.

异步
有开启新线程的能力, 什么时候开启新线程呢?

  1. 当使用并发队列时, 肯定会开启新的线程.
  2. 在新创建的队列中执行异步操作任务, 也会开启新线程.
  3. 在当前队列中执行异步任务时, 不会开启新线程.
    无论哪种情况异步, 都不会阻塞当前线程.

总结

1.同步执行没有开启新线程的能力, 所有的任务都只能在当前线程执行

2.异步执行有开启新线程的能力, 但是, 有开启新线程的能力, 也不一定会利用这种能力, 也就是说, 异步执行是否开启新线程, 需要具体问题具体分析

3.并发队列中的任务会放到不同的线程中去执行.

4.串行队列中的任务只会放到同一线程中去执行.

队列有2种,执行方式有2种
相互组合有四种情况:

串行同步执行
不会开启新线程, 在当前线程中顺序执行任务

代码验证

 
    dispatch_queue_t queue = dispatch_queue_create("serial queue", DISPATCH_QUEUE_SERIAL);
    
    dispatch_sync(queue, ^{
        NSLog(@"task1---------%@", [NSThread currentThread]);
    });
    
    dispatch_sync(queue, ^{
        NSLog(@"task2---------%@", [NSThread currentThread]);
    });
    
    dispatch_sync(queue, ^{
        NSLog(@"task3---------%@", [NSThread currentThread]);
    });
    
    NSLog(@"task4---------%@", [NSThread currentThread]);

输出

task1---------<NSThread: 0x60400006b2c0>{number = 1, name = main}
task2---------<NSThread: 0x60400006b2c0>{number = 1, name = main}
task3---------<NSThread: 0x60400006b2c0>{number = 1, name = main}
task4---------<NSThread: 0x60400006b2c0>{number = 1, name = main}

试试把任务添加在主队列中, 同步执行, 是什么情况? 崩溃在这里解析

串行异步
在当前队列中添加任务, 不会开启新线程, 按顺序执行, 不会阻塞当前线程.
如果新的队列中添加任务, 会开启新线程, 按顺序执行, 不会阻塞当前线程.

代码验证


    dispatch_queue_t queue = dispatch_queue_create("serial queue", DISPATCH_QUEUE_SERIAL);
    
    dispatch_async(queue, ^{
        NSLog(@"task1---------%@", [NSThread currentThread]);
    });
    
    dispatch_async(queue, ^{
        NSLog(@"task2---------%@", [NSThread currentThread]);
    });
    
    dispatch_async(queue, ^{
        NSLog(@"task3---------%@", [NSThread currentThread]);
    });
    
    NSLog(@"task4---------%@", [NSThread currentThread]);

输出

task4---------<NSThread: 0x6040000648c0>{number = 1, name = main}
task1---------<NSThread: 0x60000026d740>{number = 3, name = (null)}
task2---------<NSThread: 0x60000026d740>{number = 3, name = (null)}
task3---------<NSThread: 0x60000026d740>{number = 3, name = (null)}

并发同步
不会开启新的线程, 任务按顺序执行, 不能实现并发, 阻塞当前线程

代码验证


    dispatch_queue_t queue = dispatch_queue_create("serial queue", DISPATCH_QUEUE_CONCURRENT);
    
    dispatch_sync(queue, ^{
        NSLog(@"task1---------%@", [NSThread currentThread]);
    });
    
    dispatch_sync(queue, ^{
        NSLog(@"task2---------%@", [NSThread currentThread]);
    });
    
    dispatch_sync(queue, ^{
        NSLog(@"task3---------%@", [NSThread currentThread]);
    });
    
    NSLog(@"task4---------%@", [NSThread currentThread]);

输出

task1---------<NSThread: 0x60400006bb40>{number = 1, name = main}
task2---------<NSThread: 0x60400006bb40>{number = 1, name = main}
task3---------<NSThread: 0x60400006bb40>{number = 1, name = main}
task4---------<NSThread: 0x60400006bb40>{number = 1, name = main}

并发异步

会开启新的线程, 任务同时进行, 实现并发操作, 不会阻塞当前线程

任务是真的同时进行吗? 会的同学请@我, 学习下 是不是真正的并发和 CPU 核数一一对应?

代码验证


    dispatch_queue_t queue = dispatch_queue_create("serial queue", DISPATCH_QUEUE_CONCURRENT);
    
    dispatch_async(queue, ^{
        NSLog(@"task1---------%@", [NSThread currentThread]);
    });
    
    dispatch_async(queue, ^{
        NSLog(@"task2---------%@", [NSThread currentThread]);
    });
    
    dispatch_async(queue, ^{
        NSLog(@"task3---------%@", [NSThread currentThread]);
    });
    
    dispatch_async(queue, ^{
        NSLog(@"task4---------%@", [NSThread currentThread]);
    });
    
    dispatch_async(queue, ^{
        NSLog(@"task5---------%@", [NSThread currentThread]);
    });
    
    dispatch_async(queue, ^{
        NSLog(@"task6---------%@", [NSThread currentThread]);
    });
    
    dispatch_async(queue, ^{
        NSLog(@"task7---------%@", [NSThread currentThread]);
    });
    
    dispatch_async(queue, ^{
        NSLog(@"task8---------%@", [NSThread currentThread]);
    });
    
    
    NSLog(@"task9---------%@", [NSThread currentThread]);

输出

task9---------<NSThread: 0x600000077140>{number = 1, name = main}
task1---------<NSThread: 0x600000276b40>{number = 3, name = (null)}
task4---------<NSThread: 0x6000000753c0>{number = 6, name = (null)}
task2---------<NSThread: 0x604000463f80>{number = 4, name = (null)}
task3---------<NSThread: 0x600000276a80>{number = 5, name = (null)}
task5---------<NSThread: 0x604000464040>{number = 7, name = (null)}
task7---------<NSThread: 0x6000000753c0>{number = 6, name = (null)}
task6---------<NSThread: 0x600000276b40>{number = 3, name = (null)}
task8---------<NSThread: 0x604000463f80>{number = 4, name = (null)}

参考GCD队列、同步异步

相关文章

  • 第九篇:Objective-C 知识回顾多线程

    9.1.同步/异步 和 串行/并发 问题一:同步/异步 和 串行/并发组合有哪些? dispatch_sync(s...

  • GCD的几种创建方式及基本使用

    同步函数 同步函数+主队列 同步函数+串行队列 同步函数+并发队列 异步函数 异步函数+主队列 异步函数+串行队列...

  • 多线程处理(问题使用方法)

    一、同步与异步、串行与并发: 首先我们要明白:什么是同步、异步?什么是并发、串行?同步、异步是提交任务的一种方式,...

  • 多线程GCD笔记

    同步函数 + 主队列 异步函数 + 主队列 同步函数 + 串行队列 异步函数 + 串行队列 同步函数 + 并发队列...

  • GCD 死锁

    GCD死锁 同步 异步 串行 并发

  • 关于GCD总结

    什么是GCD 理解串行、并发及同步异步 串行和并发 同步和异步 队列 串行队列 两者等效.2)使用主队列(在主队列...

  • iOS面试8 - 多线程

    GCD 同步异步, 串行并发同步串行: dispatch_sync(serial_queue, ^{ // wor...

  • iOS多线程(一)

    1.常见术语 --- 同步、异步、并发、串行 1.1同步和异步主要影响:能不能开启新的线程 1.2并发和串行...

  • 多线程的运用

    同步串行队列 同步并发队列 异步串行队列 异步并发队列 队列组 栅栏 队列组和栅栏的组合 信号量 死锁主线程 分析...

  • ios GCD概述

    GCD 容易混淆的术语 同步/异步/并发/串行 同步和异步: 决定要不要开启新的线程 并发与串行 决定了任务的执行...

网友评论

    本文标题:同步 异步 串行 并发

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