如何解决为什么IO Dispatchers在Kotlin corotines中创建64个以上的线程?
据我了解,Dispatchers.IO可以创建的最大线程数为64,但是我的结果有些棘手。
这是我的代码。
repeat(500) {
CoroutineScope(Dispatchers.IO).launch {
println(Thread.currentThread().name)
}
}
这就是结果。
...
DefaultDispatcher-worker-18
DefaultDispatcher-worker-46
DefaultDispatcher-worker-17
DefaultDispatcher-worker-47
DefaultDispatcher-worker-69
DefaultDispatcher-worker-64
DefaultDispatcher-worker-66
DefaultDispatcher-worker-67
DefaultDispatcher-worker-68
DefaultDispatcher-worker-41
...
为什么我的线程池数大于64? 这是否意味着我实际创建的线程超过64个?
感谢您的阅读! 请帮助我
解决方法
我不知道Dispachers.IO如何命名为线程,但一次只能运行64个协程。
如果要将其限制为CPU数量,则需要设置以下系统属性:kotlinx.coroutines.io.parallelism
fun main(args: Array<String>) {
class Counter {
private var current=0
private var max=0
fun addOne() {
synchronized(this) {
current++
max = Math.max(max,current)
}
}
fun subOne() {
synchronized(this) {
current--
}
}
fun getMax() = max
}
val counter=Counter()
val jobs = (0..500).map {
CoroutineScope(Dispatchers.IO).launch {
counter.addOne()
Thread.sleep(100)
counter.subOne()
}
}
var done = false
while(!done) {
val j = jobs.find{it.isActive}
if( j == null) {
done = true
} else {
Thread.sleep(100)
}
}
println("max = ${counter.getMax()}")
}
,
根据kotlin官方手册的描述,由于协程的线程共享特性,在IO调度器上的操作过程中可以创建(但不使用)超过64个(默认并行)线程。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。