update.ちょっと自分用のメモです。2つ並行で動かして片方がエラーの時にもう片方も止まる。}出力結果はこうなる。片方が死ぬのでもう片方も止まる。kotlin.concurrent.ThreadsKt$thread$thread$1.run(Thread.kt:30)内部的になぜこうなるのかを知りたかったです。JobSupport#_state)としてエラーなどを伝える先を保持しており、エラーが起きた時にその先に知らせることで、伝搬していることがわかりました。内部のCoroutineの状態の変化をデバッグで出力してみます。■で始まる行が変更されるCoroutineで、->の前が変更前の状態、->の後が変更後の状態になる。list=List{Active}[]]->CompletedExceptionally[java.lang.RuntimeException]長いこれを読み解いていきます。最初の状態まず最初は全てEmpty{Active}になっている。これを図にするとこうなる。このように木が作られる。コードで言うと以下のようになる。}JobSupport.ktにある図でいうとここになっている。beforeの直前のExceptionが起きる直前はこうなる。この状態のところに親や子に伝えるリスナーみたいなのが入っている。ChildContinuationが親にExceptionなどを知らせ、ChildHandleが子にExceptionなどを知らせるために使われる。JobSupport.ktにある図でいうとここになっている。終了する前にExceptionが起きた直後はまずFinishingになる。coroutine#3、つまりExceptionが起きるcoroutinesがまずFinishingになり、その次にcoroutine#1、つまりlaunchがFinishingになる。その次にcoroutine#2がFinishingになる。その3つが渡るとこうなります。Exceptionが起きた後Exceptionが起きた後は以下のようにCompletedExceptionally状態になります。continuation.resumeWithException(exception)thisは渡しているasync()で渡しているFunction。exceptionにはRuntimeExceptionが入っている。}processBareContinuationResumeはこんなふうになっている。exception)を呼んでいるブロック。exception)を呼び出すと中断している場所でExceptionが起こる。}completeしているかどうかのチェックなどがあり、最終的にtryFinalizeFinishingState()が呼ばれる。COMPLETING_RETRYJobSupportのドキュメントに以下のように書いてある。メインの処理は3つあるみたい。onCompletedExceptionallystate.list?notifyCompletionを呼び出す。その処理内容はstateが持っているlistに全てinvokeを呼び出す。state.list?.notifyCompletion(cause)...ここで面白いクラスが登場します。親によって使われる、子供のキャンセルを待つクラスです。このinvokeが呼び出されます。このparentはStandaloneCoroutineです。}ここでStandaloneCoroutineに対してtryFinalizeFinishingState()がまた呼び出され、最終的に終了状態になるみたいです。こんな感じで伝わっていきます。AndroidFollow株式会社サイバーエージェントサイバーエージェントは「21世紀を代表する会社を創る」をビジョンに掲げ、インターネットテレビ局「AbemaTV」の運営や国内トップシェアを誇るインターネット広告事業を展開しています。インターネット産業の変化に合わせ新規事業を生み出しながら事業拡大を続けています。