swift - Dispatch之系统队列的使用1

秦经义
2023-12-01

Dispatch是系统提供的一套用于进行多核多线程编程的API,dispatch会根据CPU的使用情况自动的去创建任务,并把任务提交到队列中进行执行,提高了程序的运行效率

小知识点:Dispatch在GCD层面是没有线程的概念的,其结构是一个先进先出的队列结构。通过block块的方式去提交任务然后会自动的去创建线程并且交给CPU进行执行

两种方法创建一个简单的队列

1、

/*简单的方法去创建线程*/

    func example1() -> Void {

        let queue1 = DispatchQueue(label: "queue1")

        print("queue1:\(queue1)")

    }

2、

 /*含有属性设置的队列*/

    func example2() -> Void {

        let label:String = "queue1" // 线程标签名

        let qos = DispatchQoS.init(qosClass: .default, relativePriority: 0) // 队列的优先级

        let attributes = DispatchQueue.Attributes.concurrent // 队列的种类(并行队列)

        let autoreleaseFrequency = DispatchQueue.AutoreleaseFrequency.never // 队列是否自动释放

        let queue1 = DispatchQueue(label: label, qos: qos, attributes: attributes, autoreleaseFrequency: autoreleaseFrequency, target: nil)

        print("queue1:\(queue1)")

    }

系统提供的队列种类有两种、第一种是主线程队列,第二种是全局线程队列

例如:主线程队列于全局线程队列

/*主线程队列于全局线程队列*/

    func example3() -> Void {

        let mainQueue = DispatchQueue.main

        print("主线程队列:\(mainQueue)")

        let grobleQueue = DispatchQueue.global()

        print("全局线程队列:\(grobleQueue)")

    }

串行队列于并行队列的特点与不同

串行队列:串行队列按照提交的先后顺序依次执行,执行完一个任务才能执行下一个任务

并行队列:并行队列无法确定任务的完成先后顺序,多个任务同时进行执行

同步提交与异步提交的特点与不同

同步提交:sync 执行完进行结果返回

异步提交:async 立即进行返回

两者之间的配合使用:

串行队列与同步提交:

列子:

/*四个任务*/

    func task1() -> Void {

        print("task1开始执行")

        sleep(2)

        print("task1执行结束")

    }

    func task2() -> Void {

        print("task2开始执行")

        sleep(3)

        print("task2执行结束")

    }

    func task3() -> Void {

        print("task3开始执行")

        sleep(4)

        print("task3执行结束")

    }

    func task4() -> Void {

        print("task4开始执行")

        sleep(5)

        print("task5执行结束")

    }

    

    /*串行队列与同步提交*/

    func example4() -> Void {

        let serialQueue = DispatchQueue(label: "serialQueue")

        print("主线程任务开始")

        serialQueue.sync {

            self.task1()

        }

        

        serialQueue.sync {

            self.task2()

        }

        serialQueue.sync {

            self.task3()

        }

        serialQueue.sync {

            self.task4()

        }

        print("主线程任务结束")

    }

执行结果:

主线程任务开始

task1开始执行

task1执行结束

task2开始执行

task2执行结束

task3开始执行

task3执行结束

task4开始执行

task4执行结束

主线程任务结束

队列是串行队列,任务的提交方式是sync同步提交方式,提交任务后并且阻塞当前线程,任务结果无法立即返回

串行队列与异步提交:

例子:

/*四个任务*/

    func task1() -> Void {

        print("task1开始执行")

        sleep(2)

        print("task1执行结束")

    }

    func task2() -> Void {

        print("task2开始执行")

        sleep(3)

        print("task2执行结束")

    }

    func task3() -> Void {

        print("task3开始执行")

        sleep(4)

        print("task3执行结束")

    }

    func task4() -> Void {

        print("task4开始执行")

        sleep(5)

        print("task4执行结束")

    }

func example5() -> Void {

        let serialQueue = DispatchQueue(label: "serialQueue")

        print("主线程任务开始")

        serialQueue.async {

            self.task1()

        }

        serialQueue.async {

            self.task2()

        }

        serialQueue.async {

            self.task3()

        }

        serialQueue.async {

            self.task4()

        }

        print("主线程任务结束")

    }

执行结果:

主线程任务开始

主线程任务结束

task1开始执行

task1执行结束

task2开始执行

task2执行结束

task3开始执行

task3执行结束

task4开始执行

task4执行结束

同样是同步队列,async是立即返回的提交方式,本意是不阻塞当前线程,在串行队列中依次是按照任务的提交方式进行任务执行,不同点是在于是否阻塞当前主线程

总结:串行队列的特点是按照提交的任务顺序依次执行任务,提交方式的不同仅仅是对于是否阻塞主线程而言的区别


并行队列与同步提交:

例子:

/*四个任务*/

    func task1() -> Void {

        print("task1开始执行")

        sleep(2)

        print("task1执行结束")

    }

    func task2() -> Void {

        print("task2开始执行")

        sleep(3)

        print("task2执行结束")

    }

    func task3() -> Void {

        print("task3开始执行")

        sleep(4)

        print("task3执行结束")

    }

    func task4() -> Void {

        print("task4开始执行")

        sleep(5)

        print("task4执行结束")

    }

/*并行队列的同步提交方式*/

    func example6() -> Void {

        let concurrent = DispatchQueue(label: "concurrent", attributes:.concurrent)

        print("主线程任务开始")

        concurrent.sync {

            self.task1()

        }

        concurrent.sync {

            self.task2()

        }

        concurrent.sync {

            self.task3()

        }

        concurrent.sync {

            self.task4()

        }

        print("主线程任务结束")

    }

执行结果:

主线程任务开始

task1开始执行

task1执行结束

task2开始执行

task2执行结束

task3开始执行

task3执行结束

task4开始执行

task4执行结束

主线程任务结束

并行队列中去执行同步提交的任务,任务会进行阻塞执行,执行的结果与串行队列进行同步提交结果一致并没有什么区别

并行队列与异步提交:

例子

/*四个任务*/

    

    func task1() -> Void {

        print("task1开始执行")

        sleep(5)

        print("task1执行结束")

    }

    func task2() -> Void {

        print("task2开始执行")

        sleep(15)

        print("task2执行结束")

    }

    func task3() -> Void {

        print("task3开始执行")

        sleep(5)

        print("task3执行结束")

    }

    func task4() -> Void {

        print("task4开始执行")

        sleep(13)

        print("task4执行结束")

    }

func example7() -> Void {

        let concurrent = DispatchQueue(label: "concurrent", attributes:.concurrent)

        print("主线程任务开始")

        concurrent.async {

            self.task1()

        }

        concurrent.async {

            self.task2()

        }

        concurrent.async {

            self.task3()

        }

        concurrent.async {

            self.task4()

        }

        print("主线程任务结束")

    }

执行结果:

主线程任务开始

主线程任务结束

task1开始执行

task2开始执行

task3开始执行

task4开始执行

task1执行结束

task3执行结束

task4执行结束

task2执行结束

并行队列进行异步提交,多任务同时执行并且立即进行返回,执行结果的顺序是任务时间周期较短的任务


 类似资料: