GCD

作者: 我想哟 | 来源:发表于2021-03-22 18:58 被阅读0次

    主列队

    let mainQueue = DispatchQueue.main
    

    全局列队 : 本质是一个并发队列,由系统提供,方便编程,可以不用创建就直接使用。

    let globalQueue = DispatchQueue.global()
    

    串行列队 Serial 串行队列 (默认)

    let queue = DispatchQueue(label: "Serial.Queue")
    

    并发列队 Concurrent 并发队列

    let queue = DispatchQueue(label: "concurrent.com", attributes: .concurrent)
    

    队列

    ——串行队列

    在串行队列中执行任务时,任务按固定顺序执行,只能执行完一个任务后,再继续执行下一个任务 ( 这意味着串行队列同时只能执行一个任务 ) 。

    ——并发队列

    并发队列可以同时执行多个任务,任务并不一定按顺序执行,先执行哪几个任务由系统自动分配决定,等到有某个任务执行完后,就将这个任务出列,然后线程才能继续去执行其他任务。

    任务只有两种,同步任务异步任务

    ——同步任务

    无论是处在什么队列中,它都会让当前正在执行的线程等待它执行完成

    不管是串行还是异步队列,只要是同步任务,就在主线程执行 ( DispatchQueue.global().sync 例外 ) 。
    同步任务会阻塞当前线程,让当前线程只能等待它执行完毕后才能执行。
    在串行队列中,任务嵌套了 sync {} 的话会导致死锁。

    ——异步任务

    不论是串行还是异步队列,只要是异步任务,就在其他线程执行 ( DispatchQueue.main.sync 例外 ) ,不同的是串行队列在执行异步任务时,只会开辟一条线程,而并发队列在执行异步任务时,可以开辟多条线程。
    异步任务不会阻塞当前线程,线程不用等待异步任务执行完成就可以继续执行其他任务/操作。
    异步任务不会产生死锁。

    相关文章

      网友评论

          本文标题:GCD

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