java - 如何在 Kotlin 的公共(public)池下创建单线程协程上下文?

标签 java multithreading kotlin threadpool kotlin-coroutines

简短要求:能够创建协程上下文,该上下文将仅在单线程中执行(例如,没有并行性)。

附加要求:这些任务最好使用现有的 CommonPool(例如 Thread Pool)

实际上,kotlin 协程有方法 newSingleThreadContext,它将创建单独的线程并将所有任务调度到其中。但是,这是专用线程,因此约 1000 个这样的上下文将需要大量资源。

因此,我希望上下文具有以下特征:

  • 最多可同时执行一个任务
  • 此上下文应重用任何其他上下文(例如父上下文)。例如上下文不应包含额外的线程

最佳答案

1.6.0开始我们可以使用的 kotlinx.coroutines 库的版本 limitedParallelism CoroutineDispatcher 上的函数对象,它允许您在不创建额外线程池的情况下限制并行度,并提供一种统一的方法来创建非绑定(bind)并行度的调度程序。

使用示例:

class UserRepository {
    private val dbDispatcher = Dispatchers.IO.limitedParallelism(1)

    suspend fun getUserById(userId: Int): User? = withContext(dbDispatcher) {
        executeQuery("SELECT * FROM users WHERE id = $1", userId).singleOrNull()
   }
}

limitedParallelism(1) 保证并行限制 - 最多 1 个协程可以在此调度程序中并发执行。

应该可以解决问题:

Maximum one task can be executed at the same time.

关于java - 如何在 Kotlin 的公共(public)池下创建单线程协程上下文?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50355071/

相关文章:

maven - 如何在 Idea 中加载 kotlin 编译器 (kotlin-compiler-embeddable) 的源代码?

kotlin - 嵌套的安全通话Null Check Kotlin

JavaFX 按钮在第一次单击时没有响应

java - JTable 在绘制期间抛出 IndexOutOfBoundsException

java - 线程 : Retrieving then executing object from ArrayList

c# - 长时间处理后显示对话框

arrays - Kotlin - 在数组中查找匹配的对象

java - Android:在 ExpandableListViewActivity 的子级中访问 TextView

java - 执行 BufferedReader.close() 时 Hadoop FileSystem 关闭异常

multithreading - Kafka 高级消费者 : Can partitions have multiple threads consuming it?