1.創(chuàng)建自定義隊(duì)列
(1.)DispatchQueen(label:"") 默認(rèn)為串行隊(duì)列
//串行
let serialQueen = DispatchQueue(label:"serial");
serialQueen.sync {
print("最先加入的任務(wù)")
}
serialQueen.sync {
print("次之加入的任務(wù)")
}
print("最后的任務(wù)")
當(dāng)前線程等待串行隊(duì)列中的子線程執(zhí)行完成之后再執(zhí)行麸祷,串行隊(duì)列中先進(jìn)來的子線程先執(zhí)行任務(wù)忠怖,執(zhí)行完成后缀踪,再執(zhí)行隊(duì)列中后面的任務(wù)润脸。
自定義串行隊(duì)列嵌套執(zhí)行同步任務(wù)會發(fā)生死鎖(自定義串行隊(duì)列異步嵌套執(zhí)行同步任務(wù)同理)
let serialQueen = DispatchQueue(label:"serial");
serialQueen.sync {
print("會執(zhí)行的代碼")
serialQueen.sync {
print("不會執(zhí)行的代碼")
}
}
串行隊(duì)列中的線程順序執(zhí)行盒齿,需等到上面的同步任務(wù)執(zhí)行完畢開啟下面的同步任務(wù)焕襟。而上面的同步任務(wù)還沒有執(zhí)行完缀辩。要等到下面的大括號才算執(zhí)行完畢屠列。但是下面的同步任務(wù)已經(jīng)搶占資源了庵楷,所以它們會產(chǎn)生相互等待的轉(zhuǎn)態(tài)罢艾。
自定義并發(fā)隊(duì)列同步嵌套執(zhí)行任務(wù)不會發(fā)生死鎖
//并發(fā)
let concurrentQueue = DispatchQueue(label: "name", attributes: .concurrent)
concurrentQueue.sync {
print("會執(zhí)行的代碼")
concurrentQueue.sync {
print("會執(zhí)行的代碼")
}
}
因?yàn)槭遣l(fā)隊(duì)列萝玷,第一個大括號里的任務(wù)不會相互等待,不會產(chǎn)生死鎖昆婿。