我正在试验Kotlin协萃,并有以下代码:
fun main(args: Array<String>) = runBlocking {
val cores = Runtime.getRuntime().availableProcessors()
println("number of cores: $cores")
val jobs = List(10) {
async(CommonPool) {
delay(100)
println("async #$it on thread ${Thread.currentThread().name}")
}
}
jobs.forEach { it.join() }
}这是我的输出:
number of cores: 4
async number:0 on thread ForkJoinPool.commonPool-worker-2
async number:2 on thread ForkJoinPool.commonPool-worker-3
async number:3 on thread ForkJoinPool.commonPool-worker-3
async number:4 on thread ForkJoinPool.commonPool-worker-3
async number:5 on thread ForkJoinPool.commonPool-worker-3
async number:1 on thread ForkJoinPool.commonPool-worker-1
async number:7 on thread ForkJoinPool.commonPool-worker-3
async number:6 on thread ForkJoinPool.commonPool-worker-2
async number:9 on thread ForkJoinPool.commonPool-worker-3
async number:8 on thread ForkJoinPool.commonPool-worker-1根据Roman的回答,另一个相关的问题是:
“启动只会创建新的协同线,而CommonPool则向ForkJoinPool.commonPool()分派协同值,该ForkJoinPool.commonPool()确实使用多个线程,因此在本例中在多个CPU上执行。”
根据Java 8 文档
对于需要单独或自定义池的应用程序,可以使用给定的目标并行级别构造ForkJoinPool;默认情况下,等于可用处理器的数量。
为什么只使用3个工作线程?,即使我将异步任务的数量增加到1000+,也有相同的3个工作线程。
我的配置:带有双核cpu (带有超线程化,因此有4个可见核)、Kotlin 1.2、kotlinx-coroutines核:0.19.3和JVM 1.8。
发布于 2017-12-01 11:34:00
如果您查看CommonPool的实现,您会注意到它正在处理java.util.concurrent.ForkJoinPool或具有以下大小的线程池:
(Runtime.getRuntime().availableProcessors() - 1).coerceAtLeast(1)有了4可用的处理器,这将导致3,这就解释了为什么您会看到3个工作线程。
ForkJoinPool-size可以确定如下(将相同):
ForkJoinPool.commonPool().parallelism如果您使用coroutines版本的这个答案 1.0,请参见>=
发布于 2018-11-05 16:02:50
在Cooutines1.0中,代码看起来略有不同,因为CommonPool现在将被Dispatchers.Default所取代:
fun main(args: Array<String>) = runBlocking {
val cores = Runtime.getRuntime().availableProcessors()
println("number of cores: $cores")
val jobs = List(10) {
async(Dispatchers.Default) {
delay(100)
println("async #$it on thread ${Thread.currentThread().name}")
}
}
jobs.forEach { it.join() }
}另外,现在您将得到以下内容:
它由JVM上的一个共享线程池支持。默认情况下,此调度程序使用的最大线程数等于CPU核数,但至少为两个。
https://stackoverflow.com/questions/47591733
复制相似问题