本篇内容多线程相关
案例一
DispatchGroup&DispatchSemaphore
- 代码如下:
//1.有线程任务(A,B,C),执行任务C之前,必须完成任务A,B.
func monitorTaskGroup(){
let group = DispatchGroup.init()
//任务A
DispatchQueue.global().async(group: group, execute: DispatchWorkItem.init(block: {
//创建信号量为0
let semaphore = DispatchSemaphore.init(value: 0)
//开启异步任务
DispatchQueue.global().async {
sleep(2)
print("完成A内任务")
semaphore.signal()
}
//调用wait()方法,此时信号量为0,会阻塞当前线程.当完成A内任务signal(),当前线程继续执行.
semaphore.wait()
print("完成任务A\(Thread.current)")
}))
//任务B
DispatchQueue.global().async(group: group, execute: DispatchWorkItem.init(block: {
//创建信号量为0
let semaphore = DispatchSemaphore.init(value: 0)
//开启异步任务
DispatchQueue.global().async {
sleep(2)
print("完成B内任务")
semaphore.signal()
}
semaphore.wait()
print("完成任务B\(Thread.current)")
}))
//通知任务A,B已经全部完成
group.notify(queue: DispatchQueue.main) {
//开启任务C
print("开启任务C")
}
}
案例二
DispatchQueue&DispatchSemaphore
- 代码如下:
//2.有线程任务(A,B,C),执行顺序要求为A->B->C依次完成.
func executeTasksAsLine (){
// 创建并发队列
let concurrentQueue = DispatchQueue(label: "concurrentQueue", attributes: .concurrent)
//初始化信号量为1
let semaphore = DispatchSemaphore(value: 1)
// 异步操作加入第一个线程任务
concurrentQueue.async() {
semaphore.wait()
DispatchQueue.global().async {
sleep(3)
print("A-----------A")
semaphore.signal()
}
}
// 异步操作加入第二个
concurrentQueue.async() {
semaphore.wait()
DispatchQueue.global().async {
sleep(3)
print("B-----------B")
semaphore.signal()
}
}
// 异步操作加入第三个
concurrentQueue.async() {
semaphore.wait()
DispatchQueue.global().async {
sleep(3)
print("C-----------C")
semaphore.signal()
}
}
}