0
点赞
收藏
分享

微信扫一扫

多线程系列面试题2 - 线程的同步,异步,串行,并发

40dba2f2a596 2022-02-11 阅读 79

首先要分清楚

同步和异步是开启线程的能力区别

串行和并发指的是队列也就是开启的线程以什么方式执行

同步(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
 

举报

相关推荐

0 条评论