今天朋友问了一个问题,就是标题,但是我特么百度一搜 Java 啥的一大堆 ,据说是面试题目, 我这里也就写了一个
金典题目:
有A,B,C三个线程, A线程输出A, B线程输出B, C线程输出C,要求, 同时启动三个线程
按顺序输出ABC, 无限循环
//这里采用信号量解决,GCD中 有3个函数是针对信号量(semaphore)的操作的
dispatch_semaphore_create 创建一个semaphore
dispatch_semaphore_signal 发送一个信号
dispatch_semaphore_wait 等待信号
简单的说一下作用,套的百度到的话语,感觉不错
简单的介绍一下这三个函数,第一个函数有一个整形的参数,我们
可以理解为信号的总量,
dispatch_semaphore_signal 是发送一个信号,自然会让信号总量加1
dispatch_semaphore_wait 等待信号,当信号总量少于0的时候就会一直等待,否则就可以正常的
执行,并让信号总量-1,根据这样的原理,我们便可以快速的创建
一个并发控制来同步任务和有限资源访问控制
好了 废话不多说直接上代码
import Foundation
// 使用信号量
// 初始 A线程的信号量为 1 ,为了 A 线程不用等待直接执行
var ASemaphore = dispatch_semaphore_create(1)
var BSemaphore = dispatch_semaphore_create(0)
var CSemaphore = dispatch_semaphore_create(0)
var queue = dispatch_queue_create("com.maozhua", DISPATCH_QUEUE_CONCURRENT)
dispatch_async(queue) { () -> Void in
while true{
dispatch_semaphore_wait(ASemaphore, DISPATCH_TIME_FOREVER);
print("A")
dispatch_semaphore_signal(BSemaphore)
}
}
dispatch_async(queue) { () -> Void in
while true{
dispatch_semaphore_wait(BSemaphore, DISPATCH_TIME_FOREVER);
print("B")
dispatch_semaphore_signal(CSemaphore)
}
}
dispatch_async(queue) { () -> Void in
while true{
dispatch_semaphore_wait(CSemaphore, DISPATCH_TIME_FOREVER);
print("C")
dispatch_semaphore_signal(ASemaphore)
}
}
//因为是写的命令行代码 所以 开启runloop 保证线程不死
NSRunLoop.mainRunLoop().run()
OK 结果,代码可以直接复制 运行 自己试试