当前位置:嗨网首页>书籍在线阅读

08-共享线程池

  
选择背景色: 黄橙 洋红 淡粉 水蓝 草绿 白色 选择字体: 宋体 黑体 微软雅黑 楷体 选择字体大小: 恢复默认

12.3.2 共享线程池

CommonPool代表共享线程池,主要用来调度密集型协程任务的执行。CommonPool的源码位于kotlinx/coroutines/experimental/CommonPool.kt文件中,相关代码如下。

private fun createPool(): ExecutorService {
    val fjpClass = Try { Class.forName("java.util.concurrent.ForkJoinPool") }
        ?: return createPlainPool()
    if (!usePrivatePool) {
        Try { fjpClass.getMethod("commonPool")?.invoke(null) as? ExecutorService }
            ?.let { return it }
    }
    Try { fjpClass.getConstructor(Int::class.java).newInstance (defaultParallelism()) as? ExecutorService }
        ?. let { return it }
    return createPlainPool()
}
private fun createPlainPool(): ExecutorService {
    val threadId = AtomicInteger()
    return Executors.newFixedThreadPool(defaultParallelism()) {
        Thread(it, "CommonPool-worker-${threadId.incrementAndGet()}").apply 
{ isDaemon = true }
    }
}

可以看到,在函数createPool()中,CommonPool首先尝试创建一个java.util.concurrent. ForkJoinPool。ForkJoinPool是一个可以执行ForkJoinTask的ExecutorService,它可以帮助执行其他线程创建的子任务,如果创建不成功,则使用java.util.concurrent.Executors创建一个普通的线程池。