[Kotlin] コルーチンクイズ(問題編)

2018.01.05

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

Kotlinでそろそろコルーチンが正式にリリースされそうですね。

しかし、コルーチンを実際に使わないとなかなか感覚がつかめません。

最初につまずきそうな所をピックアップして問題をつくってみました。概念を説明するように具体的なコードをみたほうがわかりやすいと思ったからです。

問題

以下を実行した時に約何msになるかお答えください。

使用するクラスは以下の通り、task1,task2はRestApiなどを叩く重たい処理だと思ってください。処理1秒かかるとします。

task3はtask2の返り値を必要とし、同様に1秒かかるものとします。

class SampleTask {

    suspend fun task1(): Int {
        delay(1000, TimeUnit.MILLISECONDS)
        return 200
    }

    suspend fun task2(): String {
        delay(1000, TimeUnit.MILLISECONDS)
        return "hello"
    }

    suspend fun task3(str: String): String {
        delay(1000, TimeUnit.MILLISECONDS)
        return "$str , world"
    }

}

問題1

表示される時間は約何msでしょうか?

    fun 問題1()  {
        val time = measureTimeMillis {
            launch {
                val task = SampleTask()
                val result1 = task.task1()
                val result2 = task.task2()
                println("$result1 : $result2 ")
            }
        }
        println("time: $time")
    }

問題2

表示される時間は約何msでしょうか?

    fun 問題2() = runBlocking {
        val time = measureTimeMillis {
            launch {
                val task = SampleTask()
                val result1 = task.task1()
                val result2 = task.task2()
                println("$result1 : $result2 ")
            }
        }
        println("time: $time")
    }

問題3

表示される時間は約何msでしょうか?

    fun 問題3() = runBlocking {
        val time = measureTimeMillis {
            launch {
                val task = SampleTask()
                val result1 = async { task.task1() }
                val result2 = async { task.task2() }
                println("${result1.await()} : ${result2.await()} ")
            }
        }
        println("time: $time")
    }

問題4

表示される時間は約何msでしょうか?

    fun 問題4() = runBlocking {
        val time = measureTimeMillis {
            launch {
                val task = SampleTask()
                val result1 = task.task1()
                val result2 = task.task2()
                println("$result1 : $result2 ")
            }.join()
        }
        println("time: $time")
    }

問題5

表示される時間は約何msでしょうか?

    fun 問題5() = runBlocking {
        val time = measureTimeMillis {
            launch {
                val task = SampleTask()
                val result1 = async { task.task1() }
                val result2 = async { task.task2() }
                println("${result1.await()} : ${result2.await()} ")
            }.join()
        }
        println("time: $time")
    }

問題6

表示される時間は約何msでしょうか?

    fun 問題6() = runBlocking {
        val time = measureTimeMillis {
            launch {
                val task = SampleTask()
                val result1 = async { task.task1() }
                val result2 = async { task.task3(task.task2()) }
                println("${result1.await()} : ${result2.await()} ")
            }.join()
        }
        println("time: $time")
    }

答え

このページに答えがあると、見たくないのに見えてしまいゲンナリする人がいると思いますので、次回に書きます。(せっかちな人は実行してみてね。)

参考