【问题标题】:kotlin Coroutine multiple launchkotlin Coroutine 多次启动
【发布时间】:2020-03-08 23:49:06
【问题描述】:

如何在 kotlin 中像多线程一样进行多次启动

我想让first second 永远在同一时间工作!!

喜欢这段代码...

runBlocking {

    // first
    launch{
      first()
    }

    // second
    launch{
       second()
    }
}


suspend fun first(){
    // do something 
    delay(1000L)

    // Recursive call
    first() 
}

suspend fun second(){
    // do something 
    delay(1000L)

    // Recursive call
    second() 
}

【问题讨论】:

    标签: kotlin coroutine kotlin-coroutines


    【解决方案1】:

    您可以使用循环实现无限执行

    runBlocking {
        launch { while(true) first() }
        launch { while(true) second() }
    }
    
    suspend fun first(){
        // do something 
        delay(1000L)
    }
    
    suspend fun second(){
        // do something 
        delay(1000L)
    }
    
    

    【讨论】:

      【解决方案2】:

      如果您的示例代码是您的应用程序中唯一正在运行的代码,那么它已经可以工作了。如果您需要这两种方法与您的应用程序并行运行,请将它们包装在 GlobalScope.launch 中:

      GlobalScope.launch {
      
         launch { first() }
         launch { second() }
      }
      

      这将永远运行,直到被取消和/或内部抛出异常。如果您不需要在协程中占用太多资源并在使用时正确释放它们,那么您应该永远不会遇到 StackOverFlow 的问题。


      除了递归代码:尝试按照 cmets 中的建议进行循环。

      【讨论】:

      • 我其实是在评论里弄错了,所以我把它删了。由于尾调用优化,使用递归是一个很好的解决方案。我还发现要使其正常工作,必须使用delay()yield(),所以谢谢。
      • 在 Kotlin 中你不会自动获得尾递归,你必须将你的函数声明为 tailrec
      • @MarkoTopolnik 我已经用 VisualVM 测试了上面的代码和 OP 的代码,并观察到了 DispatchedContinuationfirst$1second$1 对象的内存泄漏。如果我使用delay(0)yield() 而不是delay(1000L),我会在开始后很快得到OutOfMemoryError。在函数中添加tailrec 关键字后,没有内存泄漏。
      • @vitalyros 感谢调查
      猜你喜欢
      • 1970-01-01
      • 2020-08-20
      • 1970-01-01
      • 1970-01-01
      • 2020-05-06
      • 2019-11-10
      • 2021-03-28
      • 1970-01-01
      • 2021-02-28
      相关资源
      最近更新 更多