Kotlin协程不会立即编译(挂起功能?)

时间:2019-06-04 19:46:08

标签: multithreading kotlin concurrency coroutine kotlin-coroutines

我正在浏览Kotlin协程示例,并在玩这个示例。

fun main() = runBlocking {
    GlobalScope.launch {
        repeat(1000) {i->
            println("I'm sleeping $i ...")
            delay(500)
        }
    }
    delay(1300)
}

它像预期的那样工作,打印3次并终止。如果删除最后一行delay(1300),该程序将无法识别主要功能并且无法编译。为什么会这样?

用println()替换最后一行仍然可以编译,但是只能打印一次。

1 个答案:

答案 0 :(得分:1)

发生这种情况的原因是返回类型。

main函数应返回Unit类型。

在科特林

  

我们可以使用限定的返回语法从lambda显式返回一个值。 否则,将隐式返回最后一个表达式的值。

请参见Returning a value from a lambda expression

如果delay调用删除了外部lambda的(runBlocking)返回类型,更改为Joblaunch函数的返回值),并且main也返回了Job

因此它无法运行

fun main() = runBlocking {
    GlobalScope.launch {
        repeat(1000) {i->
            println("I'm sleeping $i ...")
            delay(500)
        }
    }
    delay(1300) // returns Unit, runBlocking also returns Unit and so does main
}

移除delay

fun main() = runBlocking {
    GlobalScope.launch {
        repeat(1000) {i->
            println("I'm sleeping $i ...")
            delay(500)
        }
    } // returns Job, runBlocking also returns Job and so does main
}