DISPATCH_QUEUE_CONCURRENT 和 DISPATCH_QUEUE_SERIAL 有什么区别
What's the difference between DISPATCH_QUEUE_CONCURRENT and DISPATCH_QUEUE_SERIAL
我执行以下 class:
class GCDStudy {
func asyncSerial(time:Double){
let queue = dispatch_queue_create("DISPATCH_QUEUE_SERIAL",DISPATCH_QUEUE_SERIAL)
dispatch_async(queue){
var i:Double = 0
while(i < 3){
i++
print("asyncSerial -wait:\(time)-\(i)")
}
}
}
func asyncConcurrent(time:Double){
let queue = dispatch_queue_create("DISPATCH_QUEUE_CONCURRENT",DISPATCH_QUEUE_CONCURRENT)
dispatch_async(queue){
var i:Double = 0
while(i < 3){
i++
print("asyncConcurrent -wait:\(time)-\(i)")
}
}
}
}
和运行如下:
运行答:
gCDStudy = GCDStudy()
gCDStudy.asyncSerial(1)
gCDStudy.asyncSerial(2)
运行 B
vgCDStudy2 = GCDStudy()
gCDStudy2.asyncConcurrent(1)
gCDStudy2.asyncConcurrent(2)
结果运行A:
asyncSerial -wait:1.0-1.0
asyncSerial -wait:2.0-1.0
asyncSerial -wait:1.0-2.0
asyncSerial -wait:2.0-2.0
asyncSerial -wait:1.0-3.0
asyncSerial -wait:2.0-3.0
运行B 的结果:
asyncSerial -wait:1.0-1.0
asyncSerial -wait:2.0-1.0
asyncSerial -wait:1.0-2.0
asyncSerial -wait:2.0-2.0
asyncSerial -wait:1.0-3.0
asyncSerial -wait:2.0-3.0
这些结果是一样的,它们之间有什么不同?
有时这些结果是不同的。
谢谢
串行队列按照它们被添加到队列的顺序一次执行一个任务,而并发队列同时执行一个或多个任务。需要注意的重要一点是,即使对于 并发队列 ,任务也是按照它们被添加到队列中的顺序启动的。因此,在您的情况下,您可能看不到输出有任何变化,因为 print
将由并发队列中的每个线程执行得非常快,因此看起来好像它们是按顺序执行的。
如果您希望看到差异,也许您可以尝试按如下方式更新您的代码:
class GCDStudy {
func asyncSerial(time: Double) {
let queue = dispatch_queue_create("DISPATCH_QUEUE_SERIAL", DISPATCH_QUEUE_SERIAL)
for i in 0..<3 {
dispatch_async(queue) {
print("asyncSerial -wait:\(time)-\(i)")
}
}
}
func asyncConcurrent(time: Double) {
let queue = dispatch_queue_create("DISPATCH_QUEUE_CONCURRENT", DISPATCH_QUEUE_CONCURRENT)
for i in 0..<3 {
dispatch_async(queue) {
print("asyncConcurrent -wait:\(time)-\(i)")
}
}
}
}
我执行以下 class:
class GCDStudy {
func asyncSerial(time:Double){
let queue = dispatch_queue_create("DISPATCH_QUEUE_SERIAL",DISPATCH_QUEUE_SERIAL)
dispatch_async(queue){
var i:Double = 0
while(i < 3){
i++
print("asyncSerial -wait:\(time)-\(i)")
}
}
}
func asyncConcurrent(time:Double){
let queue = dispatch_queue_create("DISPATCH_QUEUE_CONCURRENT",DISPATCH_QUEUE_CONCURRENT)
dispatch_async(queue){
var i:Double = 0
while(i < 3){
i++
print("asyncConcurrent -wait:\(time)-\(i)")
}
}
}
}
和运行如下:
运行答:
gCDStudy = GCDStudy()
gCDStudy.asyncSerial(1)
gCDStudy.asyncSerial(2)
运行 B
vgCDStudy2 = GCDStudy()
gCDStudy2.asyncConcurrent(1)
gCDStudy2.asyncConcurrent(2)
结果运行A:
asyncSerial -wait:1.0-1.0
asyncSerial -wait:2.0-1.0
asyncSerial -wait:1.0-2.0
asyncSerial -wait:2.0-2.0
asyncSerial -wait:1.0-3.0
asyncSerial -wait:2.0-3.0
运行B 的结果:
asyncSerial -wait:1.0-1.0
asyncSerial -wait:2.0-1.0
asyncSerial -wait:1.0-2.0
asyncSerial -wait:2.0-2.0
asyncSerial -wait:1.0-3.0
asyncSerial -wait:2.0-3.0
这些结果是一样的,它们之间有什么不同?
有时这些结果是不同的。
谢谢
串行队列按照它们被添加到队列的顺序一次执行一个任务,而并发队列同时执行一个或多个任务。需要注意的重要一点是,即使对于 并发队列 ,任务也是按照它们被添加到队列中的顺序启动的。因此,在您的情况下,您可能看不到输出有任何变化,因为 print
将由并发队列中的每个线程执行得非常快,因此看起来好像它们是按顺序执行的。
如果您希望看到差异,也许您可以尝试按如下方式更新您的代码:
class GCDStudy {
func asyncSerial(time: Double) {
let queue = dispatch_queue_create("DISPATCH_QUEUE_SERIAL", DISPATCH_QUEUE_SERIAL)
for i in 0..<3 {
dispatch_async(queue) {
print("asyncSerial -wait:\(time)-\(i)")
}
}
}
func asyncConcurrent(time: Double) {
let queue = dispatch_queue_create("DISPATCH_QUEUE_CONCURRENT", DISPATCH_QUEUE_CONCURRENT)
for i in 0..<3 {
dispatch_async(queue) {
print("asyncConcurrent -wait:\(time)-\(i)")
}
}
}
}