Kotlin协程vs CompletableFuture

lal*_*986 0 java concurrency coroutine kotlin kotlin-coroutines

谁能解释我为什么人们应该使用协程?是否有一些协程代码示例显示了比常规Java并发代码更好的完成时间(没有神奇的delay()函数,没有人delay()在生产中使用)

在我的个人示例中,协程(第1行)反对Java代码(第2行)。也许我做错了什么?

例:

import kotlinx.coroutines.*
import java.time.Instant
import java.util.concurrent.CompletableFuture
import java.util.concurrent.Future

@ExperimentalCoroutinesApi
fun main() = runBlocking {
    val begin = Instant.now().toEpochMilli()
    val jobs = List(150_000) {
        GlobalScope.launch { print(getText().await()) } // :1
//        CompletableFuture.supplyAsync { "." }.thenAccept { print(it) } // :2
    }
    jobs.forEach { it.join() }
    println(Instant.now().toEpochMilli() - begin)
}

fun getText(): Future<String> {
    return CompletableFuture.supplyAsync {
        "."
    }
}

@ExperimentalCoroutinesApi
suspend fun <T> Future<T>.await(): T = suspendCancellableCoroutine { cont ->
    cont.resume(this.get()) {
        this.cancel(true)
    }
}
Run Code Online (Sandbox Code Playgroud)

附加问题:

为什么我应该创建此协程包装器await()?看来没有改善协程的代码版本,否则get()方法抱怨inappropriate blocking method call吗?

Lou*_*man 5

协程的目标不是“更好的完成时间”。老实说,成功的目标是使协程更易于使用

这就是说,你做了什么在你的代码是不是所有的好办法比较两个其他方法的速度。比较Java中事物的速度并获得逼真的结果非常困难,您应该阅读如何在Java中编写正确的微基准测试?尝试之前至少要这样做。您当前尝试比较两段Java代码的方式将使了解代码的实际性能行为。

要回答其他问题,答案是您不应创建该await方法。无论协同程序代码是否在内部,您都不应使用get()-或java.util.concurrent.Future- suspendCancellableCoroutine。如果要使用CompletableFuture,请使用提供的库从协程代码与之交互。