iOS Swift多线程问题:并行运行两个线程偶发异常
解决iOS Swift中线程并行执行不稳定的问题
嘿,我来帮你搞定这个并行执行不稳定的问题~
首先得搞明白你当前代码的问题所在:你创建的firstQueue和secondQueue默认是串行队列(因为没添加.concurrent属性)。串行队列的规则是:同一个队列里的任务必须按顺序一个接一个执行,但不同的串行队列理论上可以并行——不过这完全取决于系统的线程调度情况。
当系统CPU资源充足时,系统会给这两个队列各分配一个线程,它们就会开开心心地并行打印;但如果此时系统有其他高优先级任务在跑、资源紧张,系统可能只分配一个线程,两个队列的任务就只能交替执行,看起来就像串行的了,这就是你看到“有时正常、有时不行”的根本原因。
下面给你几个靠谱的解决方案:
方法一:使用系统全局并发队列
系统提供的全局并发队列本身就是为并行执行设计的,系统会自动根据资源情况调度线程,并行稳定性更高:
let globalQueue = DispatchQueue.global(qos: .userInitiated) globalQueue.async { for i in 0..<10 { print("🔷", i) } } globalQueue.async { for i in 20..<30 { print("⚪️", i) } }
方法二:自定义并发队列
如果你想自己管理队列,只需要给队列加上.concurrent属性就行——其实一个并发队列就足够跑多个并行任务了,不用搞两个:
let concurrentQueue = DispatchQueue(label: "concurrentQueue", qos: .userInitiated, attributes: .concurrent) concurrentQueue.async { for i in 0..<10 { print("🔷", i) } } concurrentQueue.async { for i in 20..<30 { print("⚪️", i) } }
当然你也可以保留两个自定义并发队列,效果类似,但没必要多创建一个队列~
方法三:用DispatchGroup管理任务(可选)
如果你需要等待两个任务都完成后做后续操作,调度组能帮你更清晰地控制流程:
let group = DispatchGroup() let globalQueue = DispatchQueue.global(qos: .userInitiated) globalQueue.async(group: group) { for i in 0..<10 { print("🔷", i) } } globalQueue.async(group: group) { for i in 20..<30 { print("⚪️", i) } } group.notify(queue: .main) { print("所有任务都完成啦!") }
总结一下:串行队列的并行执行依赖系统线程调度,稳定性没法保证;而并发队列(不管是全局的还是自定义的)能更可靠地实现并行执行,根据你的需求选对应的方案就好啦。
内容的提问来源于stack exchange,提问作者Saadullah Office
相关产品推荐
相关产品推荐

