首先要分清楚
同步和异步是开启线程的能力区别
串行和并发指的是队列也就是开启的线程以什么方式执行
同步(sync)是不能开启线程的,不管是串行队列,并发队列还是主队列都只能串行执行
异步(async)只有在主队列执行是不能开启新线程的,因为主线程已经存在,然后在并发队列,执行并发操作,串行队列执行串行操作
面试题:
主队列
同步方式在主队列的情况
print("1")
DispatchQueue.main.sync {
print("2")
}
print("3")
这个程序只会输出1,因为2,3不好说了,因为sync本质上会直接执行,并不会有延时的情况,而print("3" )也是没有延时的所以会产生死锁,这种题特别容易出现在面试
print("1")
DispatchQueue.main.async {
print("2")
}
print("3")
比如再来一题,这个答案是1,3,2理由是因为async本质上会等函数执行完再执行,但这里是个先后顺序问题,而并不是时间问题
print("1")
DispatchQueue.main.async {
print("2")
}
print("3")
for i in 0...100 {
print(i)
}
即使再加个循环,它也依然是先执行完循环,这个输出2只会在这个函数调用结束才会执行
所以总结下:在主队列里面,同步压根不能执行,异步也得等主队列当前函数结束
串行队列
print("1")
DispatchQueue(label: "queue").sync {
print("2")
print(Thread.current)
}
print("3")
print(Thread.current)
同步是一定要马上执行的所以,是1 , 2, 3,而且同步不会创建线程,所以两个都在主线程
print("1")
DispatchQueue(label: "queue").async {
print("2")
print(Thread.current)
}
print("3")
print(Thread.current)
因为是串行队列,本质上也会让主线程先跑完,所以是1,3,2 但这里会新开一个线程
并发队列
print("1")
DispatchQueue.global().sync {
print("2")
print(Thread.current)
}
print("3")
print(Thread.current)
同步来说它就是不开线程,也不准别人先跑,如果硬有人要抢,它就死给你看,所以结果是1,2,3
print("1")
DispatchQueue.global().async {
print("2")
for i in 0..<100{
print("IN\(i)")
}
print(Thread.current)
}
print("3")
print(Thread.current)
for i in 0...100 {
print(i)
这里结果虽然也是1,3,2当与前面完全不同,这里2输出的晚是因为开启线程之类的要耗点时间,导致它输出的晚了,实际上两个线程互不干扰,如果写两个for就会发现输出没有规律可言
所以总结一下:
同步(sync)是肯定会率先运行的,如果是主队列,两个都要先跑,那肯定是会死锁,所以答案都是1,2,3
异步(async)只有并发队列它不用等待,但因为更耗时,所以结果都是1,3,2