質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

非同期処理

非同期処理とは一部のコードを別々のスレッドで実行させる手法です。アプリケーションのパフォーマンスを向上させる目的でこの手法を用います。

Kotlin

Kotlinは、ジェットブレインズ社のアンドリー・ブレスラフ、ドミトリー・ジェメロフが開発した、 静的型付けのオブジェクト指向プログラミング言語です。

Q&A

解決済

1回答

2681閲覧

coroutineのディスパッチャをDispacher.IOに指定するとどこのスレッドで実行されますか?

tokumei000

総合スコア17

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

非同期処理

非同期処理とは一部のコードを別々のスレッドで実行させる手法です。アプリケーションのパフォーマンスを向上させる目的でこの手法を用います。

Kotlin

Kotlinは、ジェットブレインズ社のアンドリー・ブレスラフ、ドミトリー・ジェメロフが開発した、 静的型付けのオブジェクト指向プログラミング言語です。

0グッド

0クリップ

投稿2021/05/03 12:19

質問内容

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が何なのかわからなかった感じです。

よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

このDefaultDispatcher-worker-1とは何でしょうか? mainスレッドなのでしょうか? それともmainスレッド以外なのでしょうか?

そういう名前のスレッド (main ではないスレッド) です。

coroutineはよく「スレッドより軽量」のように紹介されています。つまりcoroutine ≠ スレッドです。

「スレッドより軽量」というのは、スレッドを効率的に再利用するため、バックグラウンド処理のたびに毎回スレッドを生成して一つのタスクが終了したら破棄するよりも軽量、ということです。スレッドを一切使わないということではありません。

投稿2021/05/03 12:35

hoshi-takanori

総合スコア7901

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tokumei000

2021/05/04 04:55

`DefaultDispatcher-worker-1`はmainスレッドでは無いんですね!ありがとうございます。 ちなみに↓のような知識はどこで学ばれましたか? 良ければご回答よろしくお願いしますm(_ _)m 「「スレッドより軽量」というのは、スレッドを効率的に再利用するため、バックグラウンド処理のたびに毎回スレッドを生成して一つのタスクが終了したら破棄するよりも軽量、ということです。スレッドを一切使わないということではありません。」
tokumei000

2021/05/04 23:21

ありがとうございます。確認しておきます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問