Swift-多线程顺序控制

3,156 阅读1分钟

本篇内容多线程相关

案例一

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()
            }
        }
    }