SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

【最新Kotlinアップデート解説】バージョン1.1からの変更点総まとめ

Kotlin最新アップデートまとめ ──非同期処理を実現する機能コルーチンを紹介

【最新Kotlinアップデート解説】バージョン1.1からの変更点総まとめ 第5回

コルーチンを含めることができるsuspend関数

 リスト2では、main()関数内に直接コルーチンを定義していました。これを、別関数に定義するとどうなるかを、次に見ていきましょう。

別の関数内でコルーチンを定義するcoroutineScopeメソッド

 リスト2の(3)~(5)のコードを別関数であるlongProcess()に定義すると、リスト4のようになります。

[リスト4]longProcess()関数
suspend fun longProcess() {  // (1)
  printMsgWithTime("longProcess開始")  // (2)
  coroutineScope {  // (3)
    launch {  // (4)
      printMsgWithTime("コルーチン開始")
      val startTime = LocalTime.now()
      while(true) {
        val now = LocalTime.now()
        val duration = Duration.between(startTime, now)
        val diff = duration.toMillis()
        if(diff > 1000) {
          break
        }
      }
      printMsgWithTime("コルーチン終了")
    }
  }
  printMsgWithTime("longProcess終了")  // (5)
}

 リスト4の(4)のlaunchブロックのコードはリスト2と全く同じです。こういったコルーチンを関数内で定義する場合は、以下の2点を行います。

関数をsuspendとする

 リスト4の(1)の関数定義に付与されているsuspendが該当します。このキーワードを付与することで、この関数内の処理はコルーチン内での処理対象となります。

coroutineScopeメソッドを利用する

 リスト4の(3)が該当します。表1の通り、suspend関数内でコルーチンを定義する場合は、coroutineScope関数を利用します。runBlocking同様に、coroutineScopeの引数ラムダ式内では暗黙的インスタンスとしてCoroutineScopeが存在することになります。

suspend関数の呼び出し方法

 こうして定義したsuspend関数を実行する方法は、以下の2種類あります。

  • suspend関数内から呼び出す。
  • コルーチン内(launchブロック内)から呼び出す。

 このことから、suspend関数はいくらでも入れ子にできますが、通常関数からは実行できず、最終的にどこかのコルーチン内(launchブロック内)から実行する必要があります。実際に、longProcess()関数をmain()関数内から実行する場合は、リスト5のコードとなり、runBlocking内のlaunch内で実行しているのがわかります。

[リスト5]longProcess()関数を実行するmain()関数の例
fun main() {
  runBlocking {
    printMsgWithTime("main開始")
    launch {
      longProcess()
    }
    printMsgWithTime("main終了")
  }
}

 ここで、リスト5の実行結果を確認しておくと、リスト6のようになります。リスト4のコードと対応する番号をコメントとして記述しています。この結果を見ると、main()関数の処理が先に終了し、非同期処理となっているのがわかります。

[リスト6]リスト5の実行結果例
main開始: 03:34:30.586356; 3
main終了: 03:34:30.591964; 3
longProcess開始: 03:34:30.593925; 3  // (2)
コルーチン開始: 03:34:30.597843; 3
コルーチン終了: 03:34:31.598914; 3
longProcess終了: 03:34:31.599153; 3  // (5)

指定時間実行を遅らせるdelay()

 ここまで、リスト2もリスト4も、1秒間の処理を行うために無限ループを利用してきました。実は、こういった指定時間処理を遅らせる関数が、Kotlinには標準で用意されています。

 それが、delay()です。引数として、遅らせる時間をミリ秒で指定します。これを利用すると、longProcess()関数は、リスト7のようになります。

[リスト7]delay()を利用したlongProcess()関数
suspend fun longProcess() {
  printMsgWithTime("longProcess開始")
  delay(1000)
  printMsgWithTime("longProcess終了")
}

 ここでの注意点は、delay()はsuspend関数である、ということです。そのため、先述のように、内部でdelay()を利用する関数は、必ずsuspend関数とする必要があります。リスト7のlongProcess()関数シグネチャからsuspendを取り除くと、コンパイルエラーとなるので注意してください。

launchの戻り値はJob

 実は、launch()メソッドには戻り値があり、Jobオブジェクトとなっています。このJobオブジェクトのcancel()メソッドを実行することで、コルーチンを途中でキャンセルできます。例えば、リスト8のコードです。

[リスト8]launchの戻り値を利用しているコード例
val job = launch {
  longProcess()
}
  :
job.cancel()

[NOTE]もうひとつのコルーチン定義であるasync

 launch()の戻り値がJobということは、コルーチンから何かの実行結果として具体的な値をリターンできないことを意味します。この問題を避けるために、実は、コルーチンを定義するメソッドとして、もうひとつasyncがあります。誌面の都合上、詳細は公式ドキュメントなどの別媒体に譲りますが、このメソッドを利用することで、コルーチン内の結果を取得し利用できるようになります。

次のページ
並列処理とコルーチンコンテキスト

この記事は参考になりましたか?

【最新Kotlinアップデート解説】バージョン1.1からの変更点総まとめ連載記事一覧

もっと読む

この記事の著者

WINGSプロジェクト 齊藤 新三(サイトウ シンゾウ)

WINGSプロジェクトについて>有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。2018年11月時点での登録メンバは55名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂きたい。著書記事多数。 RSS X: @WingsPro_info(公式)、@WingsPro_info/wings(メンバーリスト) Facebook <個人紹介>WINGSプロジェクト所属のテクニカルライター。Web系製作会社のシステム部門、SI会社を経てフリーランスとして独立。屋号はSarva(サルヴァ)。HAL大阪の非常勤講師を兼務。

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

山田 祥寛(ヤマダ ヨシヒロ)

静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト」代表。主な著書に「独習シリーズ(Java・C#・Python・PHP・Ruby・JSP&サーブレットなど)」「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravelなど)」「改訂3版JavaScript本格入門」「これからはじめるReact実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/22420 2025/10/29 11:00

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング