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执行结束
并行队列进行异步提交,多任务同时执行并且立即进行返回,执行结果的顺序是任务时间周期较短的任务