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创建一个普通的线程池。