如何计算线程[Kotlin]的线程池?
考虑以下代码:如何计算线程[Kotlin]的线程池?,kotlin,kotlin-coroutines,Kotlin,Kotlin Coroutines,考虑以下代码: suspend fun childTaskExecutor() { GlobalScope.future(Dispatchers.Default) { val currentThread = Thread.currentThread() logger.info("[childTaskExecutor] running on ${currentThread.name} group : ${currentThread.threadG
suspend fun childTaskExecutor() {
GlobalScope.future(Dispatchers.Default) {
val currentThread = Thread.currentThread()
logger.info("[childTaskExecutor] running on ${currentThread.name} group : ${currentThread.threadGroup}")
}.awaitOrNull()
}
运行此命令时,输出为:
在DefaultDispatcher-worker-9组上运行的[childTaskExecutor]java.lang.ThreadGroup[name=main,maxpri=10]
当我将上下文更改为Dispatchers.IO
时,输出为:
在DefaultDispatcher-worker-6组上运行:java.lang.ThreadGroup[name=main,maxpri=10]
我想知道线程属于哪个线程池(IO、默认、未定义)。有什么方法可以做到这一点吗?协同程序调度程序与线程池不同。协程调度器由线程池支持,但它们不需要使用不同的线程池。事实上,某些内置Dispatcher的线程池实际上是重叠的。这就是为什么即使使用
Dispatchers.IO
也会看到相同的DefaultDispatcher线程
这种具有重叠线程池的布局使协同路由更加高效。当您从Dispatchers.Default
切换到Dispatchers.IO
时,运行时不一定要切换线程
如果您想查看当前使用的是哪个协同路由调度器,可以从协同路由上下文中获取它。像这样:
// Prints the name of the coroutine dispatcher.
println(coroutineContext[CoroutineDispatcher])
请注意,您使用
CoroutineDispatcher
访问的伴生对象当前是实验性API,因此您需要选择使用它。只是一点提示,访问coroutineContext的元素时不需要.Key
。e、 g.如果要访问当前文件,可以编写coroutineContext[CoroutineDispatcher]
,或coroutineContext[Job]
job@AdrianK啊,很好。谢谢。好的,线程池重叠了。但是假设我已经为Dispatchers设置了一个最大限制。默认为64,IO为64。我希望我仍能获得总共128个线程。@Shivangtripath我认为如果您为它们配置最大限制,它们仍将共享线程池。我不确定你是否能得到128个线程。