Kotlinのlaunchとasyncの違いを徹底解説!初心者向け非同期処理入門
生徒
「Kotlinでlaunchとasyncってよく出てきますけど、何が違うんですか?」
先生
「とても重要なポイントですね。Kotlinの非同期処理でよく使われるのがlaunchとasyncです。見た目は似てますが、実は目的が全然違います。」
生徒
「えっ、同じようにコルーチンを使うのに、使い方が違うんですか?」
先生
「そうなんです。では、Kotlinの非同期処理の基本として、launchとasyncの違いをわかりやすく解説していきましょう!」
1. Kotlinの非同期処理とは?
Kotlinには「コルーチン(coroutine)」と呼ばれる仕組みがあります。これは、プログラムを一時停止したり再開したりできる便利な機能で、「非同期処理(ひどうきしょり)」を簡単に書けるようにしてくれます。
非同期処理とは、たとえば「ボタンを押したあとにネットからデータを取ってくる」ような時間がかかる作業を、プログラム全体を止めずに別のところでやってくれる方法です。
そんな非同期処理を実現するために使われるのが、launchとasyncです。
2. launchとは何か?
launchは、「とりあえずこの作業を別でやっておいて!」というような命令です。何かの作業を並行して進めたいときに使います。
例えば、画面に表示するアニメーションやログの記録など、「結果がいらない」処理をするときに便利です。
import kotlinx.coroutines.*
fun main() = runBlocking {
launch {
println("ログを記録中...")
delay(1000)
println("ログ完了")
}
println("メイン処理中...")
}
メイン処理中...
ログを記録中...
ログ完了
このように、launchは「仕事を頼むだけ」で、結果は特に受け取らないのが特徴です。
3. asyncとは何か?
asyncは、「この作業の結果があとで必要になるから、準備しといてね!」という命令です。つまり、処理の結果を受け取るために使います。
asyncを使うと、Deferred(ディファード)という「未来の結果を入れておく箱」のようなものが返ってきます。
import kotlinx.coroutines.*
fun main() = runBlocking {
val result = async {
delay(1000)
100 + 200
}
println("計算中...")
println("計算結果は:${result.await()}")
}
計算中...
計算結果は:300
ここで注目してほしいのはawait()です。これは、「箱の中身ができあがるまで待つ」ためのものです。
4. launchとasyncの違いを比べてみよう
ここで、launchとasyncの違いを簡単に表にまとめてみます。
| 項目 | launch | async |
|---|---|---|
| 目的 | 結果を使わない並行処理 | 結果を使う非同期計算 |
| 戻り値 | Job | Deferred(結果を持つ) |
| 結果の取得 | 不要 | await()で取得 |
| 使い道の例 | ログ記録、UI更新 | 計算処理、API通信 |
5. 実生活にたとえてみよう
たとえば、あなたがカレーを作っているとします。
launchは、「友達に皿を洗っておいて」と頼むイメージ。結果(皿がどのくらいピカピカか)は気にしません。asyncは、「友達にご飯を炊いておいて」と頼むイメージ。あとで「炊けたご飯」が必要なので、結果が大事です。
このように、launchとasyncは「目的」が大きく違うんです。
6. どちらを使えばいいの?
結論として、次のように使い分けるのが基本です。
- 何かを実行するだけで、結果がいらない →
launch - 結果をあとで使いたい →
async
この判断基準を覚えておくと、Kotlinの非同期処理がグッと分かりやすくなりますよ。
7. Kotlinの非同期処理で気をつけたいポイント
非同期処理は便利ですが、使い方を間違えるとバグの原因にもなります。特に注意したいのは、await()を忘れることです。
asyncで処理を書いたあと、await()をしないと、結果を使わないまま終わってしまいます。
また、launchやasyncの中で例外(エラー)が出ると、ちゃんとキャッチしないと見落としてしまう可能性もあります。