Kotlin コルーチンの同時実行性/並列および直列切り替え、CoroutineScope および await
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.delay
import kotlinx.coroutines.launch
import java.time.LocalTime
fun main(args: Array<String>) {
println("${LocalTime.now()} - main start")
CoroutineScope(Dispatchers.Default).launch {
// 并发执行
this.launch {
println("${LocalTime.now()} A start")
delay(1000)
println("${LocalTime.now()} A end")
}
this.launch {
println("${LocalTime.now()} B start")
delay(1500)
println("${LocalTime.now()} B end")
}
}
println("${LocalTime.now()} - main end")
}
出力は、メイン終了後に A と B に出力がないことが示されています。CoroutineScope(Dispatchers.IO).launch 新しいタスクは、メインの main タスクの実行プロセスをブロックしません。
runBlocking(Dispatchers.IO) に変更した場合:
import kotlinx.coroutines.*
import java.time.LocalTime
fun main(args: Array<String>) {
println("${LocalTime.now()} - main start")
runBlocking(Dispatchers.IO) {
// 并发执行
this.launch {
println("${LocalTime.now()} A start")
delay(1000)
println("${LocalTime.now()} A end")
}
this.launch {
println("${LocalTime.now()} B start")
delay(1500)
println("${LocalTime.now()} B end")
}
}
println("${LocalTime.now()} - main end")
}
非同期を見てください
import kotlinx.coroutines.*
import java.time.LocalTime
fun main(args: Array<String>) {
println("${LocalTime.now()} - main start")
CoroutineScope(Dispatchers.IO).launch() {
// 并发执行
this.async {
println("${LocalTime.now()} A start")
delay(1000)
println("${LocalTime.now()} A end")
}
this.async {
println("${LocalTime.now()} B start")
delay(1500)
println("${LocalTime.now()} B end")
}
}
println("${LocalTime.now()} - main end")
}
メインスレッドが 1000 ミリ秒休止した場合:
import kotlinx.coroutines.*
import java.time.LocalTime
fun main(args: Array<String>) {
println("${LocalTime.now()} - main start")
CoroutineScope(Dispatchers.IO).launch() {
// 并发执行
this.async {
println("${LocalTime.now()} A start")
delay(1000)
println("${LocalTime.now()} A end")
}
this.async {
println("${LocalTime.now()} B start")
delay(1500)
println("${LocalTime.now()} B end")
}
}
Thread.sleep(1000)
println("${LocalTime.now()} - main end")
}
import kotlinx.coroutines.*
import java.time.LocalTime
fun main(args: Array<String>) {
println("${LocalTime.now()} - main start")
runBlocking {
CoroutineScope(Dispatchers.IO).launch() {
val task1 = this.async {
println("${LocalTime.now()} A start")
delay(1000)
println("${LocalTime.now()} A end")
"task1 return"
}
val task2 = this.async {
println("${LocalTime.now()} B start")
delay(1500)
println("${LocalTime.now()} B end")
"task2 return"
}
val t1 = task1.await()
println("${LocalTime.now()} $t1")
val t2 = task2.await()
println("${LocalTime.now()} $t2")
}
}
println("${LocalTime.now()} - main end")
}
一般に、CoroutineScope(Dispatchers.IO).launch() の重要性は、メインのメインスレッドをブロックせずに新しいスレッドを開始することです。
理解して待ってください
import kotlinx.coroutines.*
import java.time.LocalTime
fun main(args: Array<String>) {
println("${LocalTime.now()} - main start")
runBlocking {
//launch() {
val task1 = this.async {
println("${LocalTime.now()} A start")
delay(3000)
println("${LocalTime.now()} A end")
"task1 return"
}
val task2 = this.async {
println("${LocalTime.now()} B start")
delay(1000)
println("${LocalTime.now()} B end")
"task2 return"
}
val t1 = task1.await()
println("${LocalTime.now()} $t1")
val t2 = task2.await()
println("${LocalTime.now()} $t2")
//}
}
println("${LocalTime.now()} - main end")
}
task2 はすぐに完了しますが、await があるため、task1 が戻るまで待つ必要があります。