57826

[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が先に全部表示されるのでしょうか？


CC BY-SA 4.0
2019-09-04T01:00:46.783
57823
2019-09-04T01:52:34.837
2019-09-04T01:10:52.473
9008
9008
question
swift マルチスレッド
DispatchQueue.main.async の実行される順番について


非同期実行は複数のスレッド/タスクをお互いの動作を無視して実行するということです。  
どのタイミングでどのスレッド/タスクが実行されるかというのは一切保証されません。

この場合はスレッドを起動するのに時間がかかるため、Aの処理が始まる前にBの処理がすべて終わってしまっているのでしょう。  
もちろん、これも常にそうなるとは保証されていません。  
環境によってはBの処理の間にAの処理が入るかもしれません。

非同期実行とはそのようなものです。


CC BY-SA 4.0
2019-09-04T01:26:39.293
57825
2019-09-04T01:42:28.013
2019-09-04T01:42:28.013
2741
2741
57823
answer

[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)したキュー
を使うとどうなるか試してみるといいと思います。


CC BY-SA 4.0
2019-09-04T01:52:34.837
57826
2019-09-04T01:52:34.837
23829
57823
answer