名词解释
- 异步或者同步是指队列之间的关系,每一个闭包代表队列执行的一个任务,如:
let queue = DispatchQueue(label: "queue_label")
let concurrentQueue = DispatchQueue(label: "queue_concurrent", attributes: .concurrent)
concurrentQueue.async { // 任务1
Thread.sleep(forTimeInterval: 2)
print(Thread.current) // 线程1
queue.sync {
print("---1 \(Date().timeIntervalSince1970)")
}
}
concurrentQueue.async { // 任务2
Thread.sleep(forTimeInterval: 2)
print(Thread.current) // 线程2
queue.sync {
print("---2 \(Date().timeIntervalSince1970)")
}
}
- 队列
concurrentQueue
异步执行任务1、任务2,任务1、2结束后分别同步到队列queue
,分别在线程1、线程2中执行。 - 虽然同步任务处于不同线程中,但无论同步队列
queue
是否为并发队列,任务1、2的同步任务都不会同时执行;
- 串行或者并发是指线程之间的关系,如:
print(Thread.current)
// 并发队列
concurrentQueue.async {
Thread.sleep(forTimeInterval: 2)
print(Thread.current)
print("---1 \(Date().timeIntervalSince1970)")
}
concurrentQueue.async {
Thread.sleep(forTimeInterval: 2)
print(Thread.current)
print("---2 \(Date().timeIntervalSince1970)")
}
队列concurrentQueue
执行两个异步任务时,由于其为并发队列,所以此时会同时开启两个线程同时执行任务。
1. 定时执行
let timer = DispatchSource.makeTimerSource()
timer.schedule(deadline: .now() + 1, repeating: 1)
timer.setEventHandler {
print("1")
}
timer.resume()
timer.suspend()
2. DispatchSemaphore
信号量
let timer = DispatchSource.makeTimerSource()
func semaphoreDemo() -> Void {
let sema = DispatchSemaphore(value: 0)
print("我要开始了啊")
print("你快点……")
timer.schedule(deadline: .now() + 1, repeating: 1)
timer.setEventHandler {
print("1")
}
timer.resume()
getListData { (reslut) in
if reslut {
sema.signal()
}
}
sema.wait()
timer.suspend()
print("我终于可以开始干活了")
}
func getListData(isFinish: @escaping (Bool) -> Void) {
DispatchQueue.global().async {
Thread.sleep(forTimeInterval: 2)
print("好了,好了!")
isFinish(true)
}
}
semaphoreDemo()
3. concurrent
并发
- 并发的快速发起:
DispatchQueue.concurrentPerform(iterations: 10) { (num) in
print(num)
}
/// 3 1 0 2 4 6 5 7 9 8
- 并发队列:
let concurrentQueue = DispatchQueue(label: "concurrent", attributes: .concurrent)
删格化barrier
:
queue.async {
print(Thread.current)
concurrentQueue.async {
Thread.sleep(forTimeInterval: 2)
print(Thread.current)
print("---1 \(Date().timeIntervalSince1970)")
}
concurrentQueue.async {
Thread.sleep(forTimeInterval: 2)
print(Thread.current)
print("---2 \(Date().timeIntervalSince1970)")
}
concurrentQueue.async(flags: .barrier) {
print("---barrier \(Date().timeIntervalSince1970)")
}
concurrentQueue.async {
Thread.sleep(forTimeInterval: 2)
print(Thread.current)
print("---3 \(Date().timeIntervalSince1970)")
}
concurrentQueue.async {
Thread.sleep(forTimeInterval: 2)
print(Thread.current)
print("---4 \(Date().timeIntervalSince1970)")
}
}
<NSThread: 0x600003924ec0>{number = 4, name = (null)}
<NSThread: 0x600003929c80>{number = 6, name = (null)}
<NSThread: 0x60000392cb40>{number = 5, name = (null)}
---1 1637307901.540108
---2 1637307901.540128
---barrier 1637307901.540168
<NSThread: 0x600003929c80>{number = 6, name = (null)}
<NSThread: 0x60000392cb40>{number = 5, name = (null)}
---4 1637307903.543823
---3 1637307903.543854
默认:
// concurrentQueue.async(flags: .barrier) {
// print("---barrier \(Date().timeIntervalSince1970)")
// }
结果为:
<NSThread: 0x6000037286c0>{number = 7, name = (null)}
<NSThread: 0x600003730ec0>{number = 4, name = (null)}
<NSThread: 0x600003720540>{number = 3, name = (null)}
---1 1637307985.040131
<NSThread: 0x6000037386c0>{number = 8, name = (null)}
<NSThread: 0x60000372c340>{number = 9, name = (null)}
---2 1637307985.040174
---4 1637307985.0403109
---3 1637307985.0402598
- 并发同步
func sync() {
for i in 0..<10 {
DispatchQueue.global().sync {
//全局并发同步
Thread.sleep(forTimeInterval: 2)
print("线程\(Thread.current)正在执行\(i)号任务")
}
}
}
线程<NSThread: 0x6000007b07c0>{number = 1, name = main}正在执行0号任务
线程<NSThread: 0x6000007b07c0>{number = 1, name = main}正在执行1号任务
线程<NSThread: 0x6000007b07c0>{number = 1, name = main}正在执行2号任务
线程<NSThread: 0x6000007b07c0>{number = 1, name = main}正在执行3号任务
线程<NSThread: 0x6000007b07c0>{number = 1, name = main}正在执行4号任务
- 并发异步
for i in 0..<5 {
DispatchQueue.global().async {
//全局并发同步
Thread.sleep(forTimeInterval: 0.2)
print("线程\(Thread.current)正在执行\(i)号任务")
}
}
线程<NSThread: 0x60000006a400>{number = 9, name = (null)}正在执行3号任务
线程<NSThread: 0x60000006c000>{number = 7, name = (null)}正在执行0号任务
线程<NSThread: 0x600000066880>{number = 10, name = (null)}正在执行2号任务
线程<NSThread: 0x600000069cc0>{number = 11, name = (null)}正在执行4号任务
线程<NSThread: 0x600000070000>{number = 12, name = (null)}正在执行1号任务
4. DispatchGroup
let group = DispatchGroup()
let queue = DispatchQueue(label: "com.concurrent.thread", qos:
DispatchQoS.default, attributes: .concurrent)
print("开始")
for i in 1...4 {
queue.async(group: group) {
//并发异步
Thread.sleep(forTimeInterval: 2)
print("线程\(Thread.current)正在执行\(i)号任务")
}
}
queue.async(group: group) {
//并发异步
Thread.sleep(forTimeInterval: 2)
print("线程\(Thread.current)正在执行\(11)号任务")
}
group.notify(queue: DispatchQueue.main) {
// 通知主线程,子线程操作已完成
print("所有任务都已经完成")
}