隊(duì)列分為 串行隊(duì)列,并行隊(duì)列压怠,特殊的主隊(duì)列
線程分為 同步線程眠冈,異步線程
搭配結(jié)果一共6種
情況1:主隊(duì)列,同步線程菌瘫。結(jié)果:死鎖
情況2:主隊(duì)列蜗顽,異步線程。結(jié)果:主線順序執(zhí)行雨让,異步實(shí)現(xiàn)最后執(zhí)行雇盖,在主線程中
情況3:串行隊(duì)列,同步線程栖忠。結(jié)果:順序執(zhí)行崔挖,在主線程中
情況4:并行隊(duì)列,同步線程娃闲。結(jié)果:順序執(zhí)行虚汛,在主線程中
情況5:串行隊(duì)列,異步線程皇帮。結(jié)果:并發(fā)執(zhí)行卷哩。不在主線程
情況6:并行隊(duì)列,異步線程属拾。結(jié)果:并發(fā)執(zhí)行将谊。不在主線程
總結(jié)一句話就是
除了主隊(duì)列以外的所有異步執(zhí)行都會(huì)新建線程。并發(fā)執(zhí)行渐白。
由于主隊(duì)列是專門(mén)負(fù)責(zé)調(diào)度主線程度的任務(wù)尊浓,不能開(kāi)辟新的線程。所以纯衍,在主隊(duì)列下的任務(wù)不管是異步任務(wù)還是同步任務(wù)都不會(huì)開(kāi)辟線程栋齿,任務(wù)只會(huì)在主線程順序執(zhí)行。
具體的驗(yàn)證代碼如下襟诸,進(jìn)行不同的注釋切換即可
func threadFunc() {
print("任務(wù)--> 1")
// 依次是:主隊(duì)列瓦堵,并行隊(duì)列,串行隊(duì)列
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("隊(duì)列中的任務(wù)---> \(index)")
}
}
print("任務(wù)---> 2")
}
另外說(shuō)一下主隊(duì)列歌亲,同步執(zhí)行死鎖的原因:
因?yàn)榇a任務(wù)需要馬上執(zhí)行菇用,但是主線程正在執(zhí)行代碼任務(wù)的方法體,因此代碼任務(wù)就必須等待陷揪,而主線程又在等待代碼任務(wù)的完成好去完成下面的任務(wù)惋鸥,因此就形成了相互等待杂穷,造成了死鎖