我第一次尝试使用Kotlin并希望得到一些帮助。
以下代码的作用是暂停执行当前函数而不休眠执行线程。暂停基于提供的时间量。该函数使用C#语言中的Coroutine支持。 (这种支持最近也被添加到Kotlin!)
Unity示例
void Start()
{
print("Starting " + Time.time);
StartCoroutine(WaitAndPrint(2.0F));
print("Before WaitAndPrint Finishes " + Time.time);
}
IEnumerator WaitAndPrint(float waitTime)
{
yield return new WaitForSeconds(waitTime);
print("WaitAndPrint " + Time.time);
}
我无法弄清楚如何在Kotlin做类似的事情。有人可以帮我指导正确的方向吗?如果我在发布答案之前弄明白,我会更新我的帖子。
提前致谢!
答案 0 :(得分:6)
请记住,协同程序是Kotlin 1.1的一部分,它仍处于EAP(早期访问预览版)中。虽然我个人取得了巨大成功,但API还不稳定,您不应该依赖它在生产中工作。此外,在Kotlin 1.1定稿时,这个答案很可能已经过时了。
private val executor = Executors.newSingleThreadScheduledExecutor {
Thread(it, "sleep-thread").apply { isDaemon = true }
}
suspend fun sleep(millis: Long): Unit = suspendCoroutine { c ->
executor.schedule({ c.resume(Unit) }, millis, TimeUnit.MILLISECONDS)
}
有一些重要的警告需要注意。与.NET相比,某些共享中心池在某处可以处理所有可挂起的方法(我甚至不确定在哪里,说实话),上面链接/显示的示例sleep方法将在执行程序池中运行所有继续工作你指定。上面链接的示例sleep
方法使用单个线程,这意味着sleep
之后发生的所有工作都将由单个线程处理。这可能不足以满足您的使用案例。
如果您对Kotlin协程的详细信息有其他疑问,我强烈建议您加入kotlinlang slack中的#coroutines频道。有关加入的详细信息,请参阅here。
答案 1 :(得分:2)
以下几乎是使用kotlix.coroutines
库将C#Unity代码逐行转换为Kotlin协程:
fun main(args: Array<String>) {
println("Starting " + Instant.now())
launch(CommonPool) { waitAndPrint(2.0f) }
println("Before waitAndPrint Finishes " + Instant.now())
// Kotlin coroutines are like daemon threads, so we have to keep the main thread around
Thread.sleep(3000)
}
suspend fun waitAndPrint(waitTime: Float) {
delay((waitTime * 1000).toLong()) // convert it to integer number of milliseconds
println("waitAndPrint " + Instant.now())
}
您可以在Guide to kotlinx.coroutines by example中了解更多内容,其中包含更多此类示例,显示Kotlin协程的各种可用功能,超越非阻塞睡眠。