DispatchQueue.main.async の実行される順番について

[code]

    import Foundation
    
    
    DispatchQueue.main.async {
        print("A")
    }
    
    print("B")
    
[/code]

上記をプレイグラウンドで試行したとろころ、毎回

[code]

    B
    A
    
[/code]

と表示されました（試した回数は5回ほど）

さらに、

[code]

    import Foundation
    
    for _ in 1...10 {
        DispatchQueue.main.async {
            print("A")
        }
    
        print("B")
    }
    
[/code]

を試したところ出力は、

[code]

    B
    B
    B
    B
    B
    B
    B
    B
    B
    B
    A
    A
    A
    A
    A
    A
    A
    A
    A
    A
    
[/code]

でした。

非同期で動くので、BとAが交互に出力される場合があってもおかしくない気がするのですが、なぜBが先に全部表示されるのでしょうか？



[code]

    DispatchQueue.main.async {
        print("A")
    }
    
[/code]

は、 `print("A")` という処理をメインキューに登録します。  
メインキューはメインスレッドで実行されます。  
メインキューとメインスレッドは一つしかありません。  
キューに登録された処理は登録された順に順番に処理されます。  
ところで、メインキューにはすでにひとつ処理が入っています。  
それは、

[code]

    import Foundation
    
    DispatchQueue.main.async {
        print("A")
    }
    
    print("B")
    
[/code]

ですね。  
つまり、 `print("B")` が終わるまでは、後からメインキューに追加された `print("A")` は実行されません。  
forで10回やる場合も同じですね。  
すべての処理はメインキューに入れられメインスレッドで実行することになるので、実はこのプログラムはマルチスレッドではなくシングルスレッドだったのです。

yohjpさんのコメントのように
[global](https://developer.apple.com/documentation/dispatch/dispatchqueue/2300077-global)
キューや、あるいは自分で[生成](https://developer.apple.com/documentation/dispatch/dispatchqueue/2300059-init)したキュー
を使うとどうなるか試してみるといいと思います。



[code]

    DispatchQueue.main.async {
        print("A")
    }
    
[/code]

は、 `print("A")` という処理をメインキューに登録します。  
メインキューはメインスレッドで実行されます。  
メインキューとメインスレッドは一つしかありません。  
キューに登録された処理は登録された順に順番に処理されます。  
ところで、メインキューにはすでにひとつ処理が入っています。  
それは、

[code]

    import Foundation
    
    DispatchQueue.main.async {
        print("A")
    }
    
    print("B")
    
[/code]

ですね。  
つまり、 `print("B")` が終わるまでは、後からメインキューに追加された `print("A")` は実行されません。  
forで10回やる場合も同じですね。  
すべての処理はメインキューに入れられメインスレッドで実行することになるので、実はこのプログラムはマルチスレッドではなくシングルスレッドだったのです。

yohjpさんのコメントのように
[global](https://developer.apple.com/documentation/dispatch/dispatchqueue/2300077-global)
キューや、あるいは自分で[生成](https://developer.apple.com/documentation/dispatch/dispatchqueue/2300059-init)したキュー
を使うとどうなるか試してみるといいと思います。

