GlobalScope.launch 没有在 runBlocking 主函数中完成任务
GlobalScope.launch doesn't finish its task inside runBlocking main function
我不明白为什么在下面的程序中 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
实际输出:
一个空文件。
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())
}
}
}
}
我不明白为什么在下面的程序中 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
实际输出:
一个空文件。
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())
}
}
}
}