1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【コルーチン】launchとsuspendの役割を改めて確認する

Posted at

コルーチンとは

コルーチンとは、軽量なスレッドのようなもので、非同期処理や並行処理を効率的に行うための仕組みです。Kotlinでは、コルーチンを使うことで、複雑な非同期処理をシンプルに書くことができます。

コルーチンの基本

通常、スレッド(Thread)を使って並行処理を行うと、スレッドの作成や切り替えに多くのリソースが必要になります。しかし、コルーチンは軽量で、スレッドを直接使うことなく並行処理を行います。これにより、パフォーマンスを大きく向上させることができます。

コルーチンは中断と再開ができるため、時間のかかる処理をバックグラウンドで実行し、必要なタイミングで再開することが可能です。

コルーチンを使う利点

  • 軽量: コルーチンはスレッドに比べて非常に軽量で、数万個のコルーチンを同時に動かすことができます。

  • 簡単に非同期処理を記述できる: コルーチンを使うことで、非同期処理を直感的に書けます。コールバック地獄(ネストしたコールバックの問題)を回避できます。

  • 同期的なコードに見える非同期処理: コルーチン内のコードは通常の同期的なコードのように書けますが、非同期で動作します。

コルーチンの基本的な使い方

コルーチンを使うには、まずlaunchsuspendなどのコルーチン関連の関数を使います。以下は、コルーチンの基本的な使い方を示す簡単な例です。

import kotlinx.coroutines.*

fun main() {
    // コルーチンを非同期に実行
    GlobalScope.launch {
        // バックグラウンドで処理を行う
        delay(1000L) // 非同期に1秒間待機
        println("Hello from Coroutine!")
    }

    println("Hello from Main Thread!")
    Thread.sleep(2000L) // メインスレッドが終了する前にコルーチンが実行されるように待機
}
  1. GlobalScope.launch:
  • コルーチンを非同期に実行するために使います。この関数が呼ばれると、非同期処理がバックグラウンドで開始されます。
  1. delay(1000L):
  • コルーチン内で時間がかかる処理(例えばネットワーク通信など)を待つために使います。ここでは、1秒間非同期に待機しています。delayは非同期処理を中断して他の処理を行うことができ、実際にスレッドをブロックすることはありません。
  1. Thread.sleep(2000L):
  • メインスレッドが終了する前に、コルーチンが実行されるように待つために使っています。Thread.sleepはメインスレッドをブロックしますが、コルーチン内のdelayはスレッドをブロックしません。

コルーチンの重要な要素

  1. launch:
  • 新しいコルーチンを非同期に開始します。launchは、非同期で実行されるタスクを開始するために使用され、結果を返さない(Unit 型)コルーチンを作成します。
  1. suspend:
  • 非同期処理を行う関数に使うキーワードです。suspend関数はコルーチン内で呼び出す必要があり、実行中に中断して再開できる関数です。例えば、delayやネットワーク通信の関数がsuspend関数です。
  1. GlobalScope:
  • コルーチンのスコープ(実行範囲)を定義します。GlobalScopeは、アプリケーション全体でコルーチンを使う場合に使用されます。実際には、スコープを指定してコルーチンのライフサイクルを管理することが推奨されますが、簡単な例ではGlobalScopeがよく使われます。

コルーチンを使った非同期処理の例

例えば、ネットワークからデータを非同期で取得する処理をコルーチンを使って書くと、以下のように書けます。

import kotlinx.coroutines.*

suspend fun fetchDataFromNetwork(): String {
    delay(2000L)  // 非同期に2秒間待機(例えば、実際にはネットワークからデータを取得)
    return "Network data"
}

fun main() {
    GlobalScope.launch {
        val data = fetchDataFromNetwork()  // suspend関数をコルーチン内で呼び出す
        println(data)  // "Network data" と表示される
    }
    
    println("Fetching data...")
    Thread.sleep(3000L)  // コルーチンが終了するのを待つため
}

このコードでは、fetchDataFromNetworksuspend関数として定義され、非同期にデータを取得しています。メインスレッドをブロックせずにバックグラウンドで非同期処理を実行できます。

まとめ

  • コルーチンは軽量なスレッドのようなもので、非同期処理や並行処理をシンプルに実行するための仕組みです。

  • launchを使ってコルーチンを非同期に開始し、suspendを使って非同期の中断・再開を行うことができます。

  • コルーチンは、スレッドを直接使わずに非同期処理を効率的に行い、コードを簡潔で直感的に書けるようにします。

コルーチンを使うことで、複雑な非同期処理を簡単に実装でき、アプリケーションのパフォーマンスも向上します。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?