协程调度程序仅限于单个线程

问题描述 投票:0回答:1

是否有像调度程序这样的东西“从默认池中选择一个工作线程并且不在线程之间跳转”?

问题的灵感来自:

    @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)
            }
        }

如果可能的话,我显然希望避免创建新线程。

kotlin kotlin-coroutines
1个回答
0
投票

这就是我现在所做的,以实现类似的目标:

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
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.