【问题标题】:Long tasks with Kotlin CoroutineKotlin 协程的长任务
【发布时间】:2020-03-12 11:02:07
【问题描述】:

我是 Kotlin 协程的新手,并试图理解它的概念。 我测试了下面的代码,我希望最后一个打印语句应该在延迟之前打印,但我无法实现。我在运行阻塞中尝试了 Dispatcher.IO,并假设它将异步运行但仍然没有任何好处。

有趣的 main() {

println(Thread.currentThread().name)

runBlocking(Dispatchers.IO) {
    println("first "+Thread.currentThread().name)
    kotlinx.coroutines.delay(3000)
    println("second "+Thread.currentThread().name)
}
println("last "+Thread.currentThread().name)

}

输出:

主要

第一个 DefaultDispatcher-worker-1

第二个 DefaultDispatcher-worker-1

最后一个主

【问题讨论】:

    标签: kotlin-coroutines


    【解决方案1】:

    runBlocking 将在转到下一行之前完成。但在该块中,您可以运行 launch(Dispatched.IO){} 块

    println(Thread.currentThread().name)
    
    runBlocking() {
        launch(Dispatchers.IO){
            println("first "+Thread.currentThread().name)
            kotlinx.coroutines.delay(3000)
            println("second "+Thread.currentThread().name)
        }
        println("still in blocking (runs at the same time as coroutines)"+Thread.currentThread().name)
    }
    println("last (runs after al coroutines are finsihed)"+Thread.currentThread().name)
    

    【讨论】:

    • 我尝试将 launch(Dispathers.IO) 置于运行阻塞中,但仍然仅在延迟最后一个打印语句打印之后。 '''fun main() { println(Thread.currentThread().name) runBlocking(Dispatchers.IO) { println("first "+Thread.currentThread().name) launch(Dispatchers.IO) { kotlinx.coroutines.延迟(3000) } println("第二个"+Thread.currentThread().name) } println("最后一个"+Thread.currentThread().name) }'''
    • @Sharad 只是稍微改变了我的答案,这样行吗?
    • 不,那也行不通。最后一个打印语句仅在延迟 3 秒后打印。根据我的理解,这不应该是因为我们使用的是 launch(Dispatchers.IO)
    • 我的回报是这样的:#main #still in blocking main #first DefaultDispatcher-worker-1 #second DefaultDispatcher-worker-1 #last main "last" 在运行阻塞之外,所以它会运行在所有协程完成之后。但“仍在阻塞中”与启动代码一起运行
    • 你是对的,但我希望“last”与 runblocking 一起运行。这有可能吗?还有一个问题,#first DefaultDispatcher-worker-1 在这里是不同的线程?
    猜你喜欢
    • 1970-01-01
    • 2022-01-10
    • 2018-02-07
    • 1970-01-01
    • 2020-01-04
    • 2019-08-24
    • 2020-02-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多