import kotlinx.coroutines.*
fun main(args:Array<String>){
val scope = GlobalScope
scope.launch {
for(i in 1..5) println(i)
}
}
코루틴을 사용하는 예시인데, 코루틴은 프로그램이 종료되거나 제어되는 스코프가 종료되면 같이 종료되므로
이 예시에서는 별다른 함수가 없으므로 println을 하기전에 프로그램이 종료된다.
코루틴 대기함수
코루틴이 확실하게 작동하게 하기 위하여 runBlocking 을 사용할 수 있는데,
import kotlinx.coroutines.*
fun main(args:Array<String>){
runBlocking {
launch {
for(i in 1..5) println(i)
}
}
}
코루틴이 종료될때 까지 메인 루틴을 대기시킨다.
하지만 runBlocking 는 코루틴이 스레드를 혼자 점유하게 되고 일정시간 응답이 없으면 ANR 오류가 발생하여 앱이 종료되므로 주의해야한다.
루틴의 대기를 위한 추가적인 함수로
delay, join, await 가 있다.
delay() : milisecond 단위로 루틴 대기
join() : Job의 실행이 끝날 때 까지 대기 (launch)
await() : deferred의 실행이 끝날 때 까지 대기, 결과값 반환 (async)
import kotlinx.coroutines.*
fun main(){
runBlocking {
val a = launch {
for (i in 1..5){
println(i)
delay(10)
}
}
val b = async{
"async 종료"
}
println("async 대기")
println(b.await())
println("launch 대기")
a.join()
println("launch 종료")
}
}
await에서 async 종료까지 대기시킨 후, 반환값을 받아 출력한 것을 확인할 수 있으며 join에서 launch가 끝날 때 까지 대기 시킨 후 종료를 출력하는 것을 확인할 수 있다.
코루틴 취소함수
cancel 를 이용하여 루틴을 취소할 수 있다.
import kotlinx.coroutines.*
fun main(){
runBlocking {
val a = launch {
for (i in 1..5){
println(i)
delay(10)
}
}
val b = async{
"async 종료"
}
println("async 대기")
println(b.await())
println("launch 취소")
a.cancel() // 취소함수
println("launch 종료")
}
}
또한 withTimeoutOrNull 을 사용하여
제한시간 내에 수행되면 결과값을, 아니면 null을 반환 받을 수도 있는데
import kotlinx.coroutines.*
fun main(){
runBlocking {
var result = withTimeoutOrNull(50){
for (i in 1..10){
println(i)
// delay(10)
}
"Finish"
}
println(result)
}
}
딜레이를 넣지 않았을경우 Finish를 출력하지만
딜레이를 넣었을 때,
import kotlinx.coroutines.*
fun main(){
runBlocking {
var result = withTimeoutOrNull(50){
for (i in 1..10){
println(i)
delay(10)
}
"Finish"
}
println(result)
}
}