2

我不明白为什么在下面的程序中GlobalScope.launch指令没有完成它的任务。

我确实理解它runBlocking无法控制GlobalScope并且使用它通常很糟糕,但这并不让我知道为什么里面的指令GlobalScope.launch {}没有按预期执行。

代码片段:

package coroutines

import kotlinx.coroutines.GlobalScope
import kotlinx.coroutines.delay
import kotlinx.coroutines.launch
import kotlinx.coroutines.runBlocking
import java.io.File

fun main() = runBlocking<Unit> {
    GlobalScope.launch {
        val file = File(javaClass.getResource("/coroutines_file.txt").path)

        file.printWriter().use { out ->
            repeat(10) { i ->
                delay(100)
                out.println(i.toString())
            }
        }
    }
}

coroutines_file 中的预期输出:

0
1
2
3
4
5
6
7
8
9

实际输出:

一个空文件。

4

1 回答 1

0

GlobalScope只是结构化并发的一个逃生口。它不能被取消,甚至没有Job关联,因此它不提供一个顶级工具来跟踪它内部启动的所有作业。

另一方面,runBlocking为启动的协程建立自己的范围,您应该继承该范围,并自动确保所有子协程运行完成。

runBlocking<Unit> {
    launch(Dispatchers.IO) {
        val file = File(javaClass.getResource("/coroutines_file.txt").path)
        file.printWriter().use { out ->
            repeat(10) { i ->
                delay(100)
                out.println(i.toString())
            }
        }
    }
}
于 2020-12-10T12:04:27.640 回答