Kotlin 异步与启动
Kotlin Async vs Launch
Kotlin_version = '1.2.41'
我对 Kotlin 还很陌生。我想知道 async
和 launch
之间有什么区别。特别是在下面的代码中
import kotlinx.coroutines.experimental.async
import kotlinx.coroutines.experimental.awaitAll
import kotlinx.coroutines.experimental.delay
import kotlinx.coroutines.experimental.launch
import kotlinx.coroutines.experimental.runBlocking
fun main(args: Array<String>) {
runBlocking {
(20..30).forEach {
launch{
println("main before" + it)
val outer = it
delay(1000L)
val lists = (1..10)
.map { async{anotherMethod(outer, it)}}
println("main after------------------Awaiting" + it)
lists.awaitAll()
println("Done awaiting -main after-----------------" + it)
}
}
println("Hello,") // main thread continues here immediately
}
}
.
suspend fun anotherMethod (outer: Int,index: Int){
println("inner-b4----" + outer + "--" + index)
delay(3000L)
println("inner-After----" + outer + "--" + index)
}
VS
fun main(args: Array<String>) {
runBlocking {
(20..30).forEach {
async{
println("main before" + it)
val outer = it
delay(1000L)
val lists = (1..10)
.map { async{anotherMethod(outer, it)}}
println("main after------------------Awaiting" + it)
lists.awaitAll()
println("Done awaiting -main after-----------------" + it)
}
}
println("Hello,") // main thread continues here immediately
}
}
suspend fun anotherMethod (outer: Int,index: Int){
println("inner-b4----" + outer + "--" + index)
delay(3000L)
println("inner-After----" + outer + "--" + index)
}
async
做return一个Deferred<>
,而launch
只做return一个Job
,两者都启动一个新的协程。所以这取决于您是否需要 return 值。
在你的第一个例子中,launch
没有 return 一个值——最后一个 println
只产生一个 Unit
。如果你像第二个例子那样使用 async
,整体结果是一样的,但是你创建了一些无用的 Deferred<Unit>
对象。
Kotlin_version = '1.2.41'
我对 Kotlin 还很陌生。我想知道 async
和 launch
之间有什么区别。特别是在下面的代码中
import kotlinx.coroutines.experimental.async
import kotlinx.coroutines.experimental.awaitAll
import kotlinx.coroutines.experimental.delay
import kotlinx.coroutines.experimental.launch
import kotlinx.coroutines.experimental.runBlocking
fun main(args: Array<String>) {
runBlocking {
(20..30).forEach {
launch{
println("main before" + it)
val outer = it
delay(1000L)
val lists = (1..10)
.map { async{anotherMethod(outer, it)}}
println("main after------------------Awaiting" + it)
lists.awaitAll()
println("Done awaiting -main after-----------------" + it)
}
}
println("Hello,") // main thread continues here immediately
}
}
.
suspend fun anotherMethod (outer: Int,index: Int){
println("inner-b4----" + outer + "--" + index)
delay(3000L)
println("inner-After----" + outer + "--" + index)
}
VS
fun main(args: Array<String>) {
runBlocking {
(20..30).forEach {
async{
println("main before" + it)
val outer = it
delay(1000L)
val lists = (1..10)
.map { async{anotherMethod(outer, it)}}
println("main after------------------Awaiting" + it)
lists.awaitAll()
println("Done awaiting -main after-----------------" + it)
}
}
println("Hello,") // main thread continues here immediately
}
}
suspend fun anotherMethod (outer: Int,index: Int){
println("inner-b4----" + outer + "--" + index)
delay(3000L)
println("inner-After----" + outer + "--" + index)
}
async
做return一个Deferred<>
,而launch
只做return一个Job
,两者都启动一个新的协程。所以这取决于您是否需要 return 值。
在你的第一个例子中,launch
没有 return 一个值——最后一个 println
只产生一个 Unit
。如果你像第二个例子那样使用 async
,整体结果是一样的,但是你创建了一些无用的 Deferred<Unit>
对象。