首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >利用Kotlin协同技术实现多线程

利用Kotlin协同技术实现多线程
EN

Stack Overflow用户
提问于 2017-12-01 10:47:20
回答 2查看 4.3K关注 0票数 3

我正在试验Kotlin协萃,并有以下代码:

代码语言:javascript
复制
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() }
}

这是我的输出:

代码语言:javascript
复制
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。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-12-01 11:34:00

如果您查看CommonPool的实现,您会注意到它正在处理java.util.concurrent.ForkJoinPool或具有以下大小的线程池:

代码语言:javascript
复制
(Runtime.getRuntime().availableProcessors() - 1).coerceAtLeast(1)

有了4可用的处理器,这将导致3,这就解释了为什么您会看到3个工作线程。

ForkJoinPool-size可以确定如下(将相同):

代码语言:javascript
复制
ForkJoinPool.commonPool().parallelism

如果您使用coroutines版本的这个答案 1.0,请参见>=

票数 6
EN

Stack Overflow用户

发布于 2018-11-05 16:02:50

在Cooutines1.0中,代码看起来略有不同,因为CommonPool现在将被Dispatchers.Default所取代:

代码语言:javascript
复制
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核数,但至少为两个。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47591733

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档