关于DispatchQueue并发队列执行异常及label作用的技术咨询
关于GCD并发调度队列的两个问题
代码示例
func myConcurrentQueue() { let concurrentQueue = DispatchQueue(label: "concurrent", attributes: .concurrent) concurrentQueue.async { print("Task 1 Con Start") print("Task 1 Con Finished") } concurrentQueue.async { print("Task 2 Con Start") print("Task 2 Con Finished") } } myConcurrentQueue()
预期与实际结果
预期执行结果:
Task 1 Con Start Task 2 Con Start Task 1 Con Finished Task 2 Con Finished
实际执行结果为任务1完全执行完毕后,任务2才开始启动。
问题1:为何并发队列会产生这样的执行结果?
并发队列的核心是允许多个任务同时执行,但任务是否会并行启动,完全由系统根据当前CPU资源、线程池状态调度。你的任务只是两行打印代码,执行耗时极短,可能系统还没来得及为第二个任务分配新线程,第一个任务就已经跑完了。
如果给任务增加一点耗时操作,比如休眠0.1秒,就能看到明显的并发效果:
func myConcurrentQueue() { let concurrentQueue = DispatchQueue(label: "concurrent", attributes: .concurrent) concurrentQueue.async { print("Task 1 Con Start") Thread.sleep(forTimeInterval: 0.1) // 添加耗时操作 print("Task 1 Con Finished") } concurrentQueue.async { print("Task 2 Con Start") Thread.sleep(forTimeInterval: 0.1) // 添加耗时操作 print("Task 2 Con Finished") } }
这时就能看到任务1启动后,任务2很快也启动,两者并行执行的结果。
问题2:DispatchQueue中的label属性是否会影响执行结果?
完全不会。label只是个调试用的标识符,作用是在Xcode调试面板、Instruments工具里区分不同队列,方便排查问题。它和队列的调度逻辑、并发特性没有任何关系,不管你设置什么字符串当label,队列的行为都不会变。
内容的提问来源于stack exchange,提问作者kkk
相关产品推荐
相关产品推荐

