GCD

2021-03-22  本文已影响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 例外 ) ,不同的是串行队列在执行异步任务时,只会开辟一条线程,而并发队列在执行异步任务时,可以开辟多条线程。
异步任务不会阻塞当前线程,线程不用等待异步任务执行完成就可以继续执行其他任务/操作。
异步任务不会产生死锁。

上一篇下一篇

猜你喜欢

热点阅读