测试Coroutin和线程之间的差异,在kotlin中使用线程时无法获得OOM错误



我现在正在学习协程,并测试线程的一些差异。参考kotlin文档,我复制了一些测试代码,并更改了测试线程的代码。

医生说https://kotlinlang.org/docs/coroutines-basics.html coroutines-are-light-weight

如果你用线程写同样的程序(去掉runBlocking,用thread代替launch,用thread .sleep代替delay),它很可能会消耗太多的内存并抛出内存不足的错误。

但是我无法得到任何关于错误的信息。我的代码有问题吗?

fun main() = runBlocking {
repeat(1000000) {
thread {
sleep(5000L)
print(".")
}
}
}

文档中的主要观点是协程比线程更轻量级。但是是否抛出内存不足错误取决于JVM的资源。可能有足够的内存来启动所有100k的线程。

您可以尝试增加线程的数量,直到您得到一个OOM错误,然后尝试启动相同数量的协程,这应该工作。在kotlin操场上很容易复制,因为它的资源有限。我已经测试了这段代码,它抛出了一个面向对象的线程,但不为协程。

import java.lang.Thread.sleep
import kotlin.concurrent.thread
import kotlinx.coroutines.*
fun main() {
try {
repeat(10_000) { // launch a lot of threads
thread {
sleep(5000L)
print(".")
}
}
} catch (e: java.lang.OutOfMemoryError) {
println("Thread creation failed: " + e)
}
try {
runBlocking {
repeat(10_000) { // launch a lot of coroutines
launch {
delay(5000L)
print(".")
}
}
}
} catch (e: java.lang.OutOfMemoryError) {
println("Coroutine creation failed: " + e)
}
}

你的报价也把runBlocking说。下面的代码只在我的机器上超时,限制为30秒。

fun main() = repeat(1000000) {
thread {
Thread.sleep(5000L)
print(".")
}
}
main()

最新更新