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