質問内容
coroutineについて学んでいるのですが、仕組みがよくわからなかったので質問です。
coroutineがどのスレッドで実行されているのかわからなかったので、以下のようなコードを書いてみました。
Thread.currentThread().name
でどのスレッドで実行されているのかを調査してる感じです。
kotlin
1class MainActivity : AppCompatActivity(), CoroutineScope by MainScope() { 2 override fun onCreate(savedInstanceState: Bundle?) { 3 super.onCreate(savedInstanceState) 4 setContentView(R.layout.activity_main) 5 6 Log.i("current", "onCreate: " + Thread.currentThread().name) 7 8 Thread(java.lang.Runnable { Log.i("current", "new thread: " + Thread.currentThread().name) }).start() 9 10 launch { 11 Log.i("current", "launch: " + Thread.currentThread().name) 12 withContext(Dispatchers.IO){ 13 Log.i("current", "withContext(Dispatchers.IO): " + Thread.currentThread().name) 14 } 15 } 16 } 17}
実行結果↓
onCreate : mainスレッド
新しく作ったスレッド : Thread-2
launch内 : mainスレッド (MainScope()はディスパッチャとしてmainを指定しているので、それを継承したlaunch内がmainスレッドで実行されているのは理解できる)
withContext(Dispatchers.IO) : DefaultDispatcher-worker-1
このDefaultDispatcher-worker-1
とは何でしょうか? mainスレッドなのでしょうか? それともmainスレッド以外なのでしょうか?
質問した経緯
この質問をした経緯を書いておきます。
coroutineはよく「スレッドより軽量」のように紹介されています。つまりcoroutine ≠ スレッドです。
そしてAndroidではインターネット通信などを行う際にメインスレッドで行うと例外が発生します。
coroutineを用いてインターネット通信などを行う時は、ディスパッチャをDispatchers.IO
に指定してそこに処理を記述することになると思うのですが、coroutine ≠ スレッド なのでこれは結局mainスレッドで処理されているのかなと思いました。しかし、これだとmainスレッドでインターネット通信をすることになるので、例外が発生するのかと思ったのですが正常に動作します。そのため、Dispatchers.IO
は果たしてどのスレッドで実行されているのかを調べてみたのですが、結局DefaultDispatcher-worker-1
が何なのかわからなかった感じです。
よろしくお願いします。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/05/04 04:55
2021/05/04 09:49
2021/05/04 23:21