Swift队列和线程的搭配执行

2021-03-01  本文已影响0人  种提莫的蘑菇

队列分为 串行队列,并行队列,特殊的主队列
线程分为 同步线程,异步线程

搭配结果一共6种
情况1:主队列,同步线程。结果:死锁
情况2:主队列,异步线程。结果:主线顺序执行,异步实现最后执行,在主线程中
情况3:串行队列,同步线程。结果:顺序执行,在主线程中
情况4:并行队列,同步线程。结果:顺序执行,在主线程中
情况5:串行队列,异步线程。结果:并发执行。不在主线程
情况6:并行队列,异步线程。结果:并发执行。不在主线程
总结一句话就是
除了主队列以外的所有异步执行都会新建线程。并发执行。
由于主队列是专门负责调度主线程度的任务,不能开辟新的线程。所以,在主队列下的任务不管是异步任务还是同步任务都不会开辟线程,任务只会在主线程顺序执行。

具体的验证代码如下,进行不同的注释切换即可

func threadFunc() {
        print("任务--> 1")
        // 依次是:主队列,并行队列,串行队列
        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("队列中的任务---> \(index)")
            }
        }
        print("任务---> 2")
    }

另外说一下主队列,同步执行死锁的原因:
因为代码任务需要马上执行,但是主线程正在执行代码任务的方法体,因此代码任务就必须等待,而主线程又在等待代码任务的完成好去完成下面的任务,因此就形成了相互等待,造成了死锁

上一篇 下一篇

猜你喜欢

热点阅读