You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 08:41:04