是否有像调度程序这样的东西“从默认池中选择一个工作线程并且不在线程之间跳转”?
问题的灵感来自:
@Test
fun testDispatchers() = runBlocking {
val t = Thread.currentThread()
launch {
check(Thread.currentThread() == t)
}
launch(Dispatchers.Default) {
val tLaunch = Thread.currentThread()
launch {
// Note the thread is different, which I don't want
check(Thread.currentThread() != tLaunch)
}
}
Unit
}
第一个
launch
将在父线程上执行,所以一切都很好。但是,一旦使用默认调度程序启动协程,后续不带参数的 launch
将在随机工作线程上运行。
如何让它仍然在同一个线程上运行?
我想我需要一个调度程序,它可以从默认池中选择一个工作线程,并在后续启动时保留该线程。
launch(newSingleThreadContext(/* pick one from default pool */) {
val tLaunch = Thread.currentThread()
launch {
// This should hold
check(Thread.currentThread() == tLaunch)
}
}
如果可能的话,我显然希望避免创建新线程。
这就是我现在所做的,以实现类似的目标:
class FileConversionDispatcher(parent: CSHasDestruct) : CoroutineDispatcher(), Executor {
companion object {
private val executorService = ThreadPoolExecutor(0, 10, 30L, SECONDS, SynchronousQueue())
fun shutdown() = executorService.shutdownAndWait()
}
private val jobs = ConcurrentLinkedQueue<Runnable>()
init {
executorService.submit {
while (!parent.isDestructed) jobs.poll()?.run() ?: Thread.yield()
}
}
override fun dispatch(context: CoroutineContext, block: Runnable) = execute(block)
override fun execute(command: Runnable?) {
jobs += command
}
}