Если у вас просто есть поток, который уже запущен, и вы не можете контролировать код, который он выполняет, то вы ничего не можете с этим поделать. Поток должен запускать событие верхнего уровня l oop, чтобы вы могли внедрить код для запуска извне.
Если по какой-либо случайности у вас есть такой вид управления, или вы можете решить, какой Runnable
поток будет запущен для начала, вот несколько довольно хакерских кодов, которым удается настроить событие l oop и отправить ему сопрограмму:
val myContextFuture = CompletableFuture<CoroutineContext>()
thread(name = "my-thread") {
runBlocking {
myContextFuture.complete(coroutineContext)
coroutineContext[Job]!!.join()
}
}
val myContext = myContextFuture.get()
Вот как вы должны запустить сопрограмму на myContext
:
val result = withContext(myContext) {
println("Running on thread ${currentThread().name}")
3
}
println("Result of the coroutine: $result")
Я бы не рекомендовал использовать этот вид кода в производстве.