如何为当前线程创建协程 Dispatcher?

时间:2021-01-01 16:06:25

标签: multithreading kotlin kotlin-coroutines

是否可以为当前线程创建一个 Dispatcher?检查此示例代码作为我想要完成的示例:

val dispatcher = if (parallel) {
  Dispatcher.Default
} else {
  // What should I write here so I just use the current thread to run doStuff?
}

val deferredList = list.map {
  async(dispatcher) { doStuff(it) }
}

2 个答案:

答案 0 :(得分:2)

当你构建一个协程时,你传递了一个 CoroutineContext 作为参数。如果您不传递任何内容,新协程将使用当前 CoroutineContext(其父级上下文)构建。

您应该瞄准 Dispatcher 而不是 CoroutineContext

val context = if (parallel) {
    Dispatchers.Default
} else {
    coroutineContext
}

val deferredList = list.map {
    async(context) { doStuff(it) }
}

您还可以使用 Element 类型作为键单独“提取”上下文的每个 Element

工作: coroutineContext[Job]

调度员: coroutineContext[ContinuationInterceptor]

ExceptionHandler: coroutineContext[CoroutineExceptionHandler]

姓名: coroutineContext[CoroutineName]

答案 1 :(得分:0)

使用Dispatchers.Unconfined,它正好用于在当前线程上运行。

整个代码如下:

val dispatcher = if (parallel) Dispatcher.Default else Dispatchers.Unconfined

val deferredList = list.map {
  async(dispatcher) { doStuff(it) }
}