队列分为 串行队列,并行队列,特殊的主队列
线程分为 同步线程,异步线程
搭配结果一共6种
情况1:主队列,同步线程。结果:死锁
情况2:主队列,异步线程。结果:主线顺序执行,异步实现最后执行,在主线程中
情况3:串行队列,同步线程。结果:顺序执行,在主线程中
情况4:并行队列,同步线程。结果:顺序执行,在主线程中
情况5:串行队列,异步线程。结果:并发执行。不在主线程
情况6:并行队列,异步线程。结果:并发执行。不在主线程
总结一句话就是
除了主队列以外的所有异步执行都会新建线程。并发执行。
由于主队列是专门负责调度主线程度的任务,不能开辟新的线程。所以,在主队列下的任务不管是异步任务还是同步任务都不会开辟线程,任务只会在主线程顺序执行。
具体的验证代码如下,进行不同的注释切换即可
func threadFunc() {
print("任务--> 1")
// 依次是:主队列,并行队列,串行队列
let queue = DispatchQueue.main
// let queue = DispatchQueue(label: "label", attributes: .concurrent)
// let queue = DispatchQueue(label: "label")
for index in 0..<10 {
// 同步异步的切换
// queue.sync {
queue.async {
if Thread.current == Thread.main {
print("是主线程")
}else {
print("不是主线程")
}
print("队列中的任务---> \(index)")
}
}
print("任务---> 2")
}
另外说一下主队列,同步执行死锁的原因:
因为代码任务需要马上执行,但是主线程正在执行代码任务的方法体,因此代码任务就必须等待,而主线程又在等待代码任务的完成好去完成下面的任务,因此就形成了相互等待,造成了死锁
网友评论