iT邦幫忙

2021 iThome 鐵人賽

DAY 29
0
Mobile Development

從零開始的Swift開發心路歷程系列 第 29

【從零開始的Swift開發心路歷程-Day29】認識GCD多執行緒Part2

昨天我們分別介紹完了SerialQueue、ConcurrentQueue、Synchronous、Asynchronous,今天就來看看使用程式碼後的執行結果會如何吧!

sync(同步) SerialQueue

let serialQueue = DispatchQueue(label: "serialQueue")
        serialQueue.sync {
            for i in 1...5{
                print("?",i)
            }
        }
        for i in 11...15{
            print("?",i)
        }

執行結果

我們可以看到,因為是同步佇列,不會開啟新的執行緒,因此只在主執行緒執行,所以要等同步佇列?執行完才會執行?for迴圈

async(非同步) SerialQueue

let serialQueue = DispatchQueue(label: "serialQueue")
        serialQueue.async {
            for i in 1...5{
                print("?",i)
            }
        }
        for i in 11...15{
            print("?",i)
        }

執行結果

由於非同步佇列會開啟新的執行緒,但是是SerialQueue,所以會等執行完位於主執行緒的?for迴圈才會執行非同步佇列?

sync(同步) ConcurrentQueue

let concurrentQueue = DispatchQueue(label: "concurrentQueue",attributes: .concurrent)
        concurrentQueue.sync {
            for i in 1...5{
                print("?",i)
            }
        }
        concurrentQueue.sync {
            for i in 11...15{
                print("?",i)
            }
        }

執行結果

因為是同步佇列,不會開啟新的執行緒,因此只在主執行緒執行,所以還是依照順序,執行完?才會執行?

async(非同步) ConcurrentQueue

let concurrentQueue = DispatchQueue(label: "concurrentQueue",attributes: .concurrent)
        concurrentQueue.async {
            for i in 1...5{
                print("?",i)
            }
        }
        concurrentQueue.async {
            for i in 11...15{
                print("?",i)
            }
        }
        concurrentQueue.async {
            for i in 101...105{
                print("?",i)
            }
        }

執行結果

我們可以看到非同步佇列會開啟新的執行緒,且會依序「開始」執行

根據以上四種組合,我們可以得知async ConcurrentQueue會開啟新的執行緒,且工作也會同時進行,所以是執行工作最快的方式。
那今天差不多介紹到這裡啦~我們明天見!


上一篇
【從零開始的Swift開發心路歷程-Day28】認識GCD多執行緒Part1
下一篇
【從零開始的Swift開發心路歷程-Day30】認識GCD多執行緒Part3(完)
系列文
從零開始的Swift開發心路歷程30

尚未有邦友留言

立即登入留言