1.创建自定义队列
(1.)DispatchQueen(label:"") 默认为串行队列
//串行
let serialQueen = DispatchQueue(label:"serial");
serialQueen.sync {
print("最先加入的任务")
}
serialQueen.sync {
print("次之加入的任务")
}
print("最后的任务")
当前线程等待串行队列中的子线程执行完成之后再执行,串行队列中先进来的子线程先执行任务,执行完成后,再执行队列中后面的任务。
自定义串行队列嵌套执行同步任务会发生死锁(自定义串行队列异步嵌套执行同步任务同理)
let serialQueen = DispatchQueue(label:"serial");
serialQueen.sync {
print("会执行的代码")
serialQueen.sync {
print("不会执行的代码")
}
}
串行队列中的线程顺序执行,需等到上面的同步任务执行完毕开启下面的同步任务。而上面的同步任务还没有执行完。要等到下面的大括号才算执行完毕。但是下面的同步任务已经抢占资源了,所以它们会产生相互等待的转态。
自定义并发队列同步嵌套执行任务不会发生死锁
//并发
let concurrentQueue = DispatchQueue(label: "name", attributes: .concurrent)
concurrentQueue.sync {
print("会执行的代码")
concurrentQueue.sync {
print("会执行的代码")
}
}
因为是并发队列,第一个大括号里的任务不会相互等待,不会产生死锁。