//join()의 경우
fun main(args : Array<String>) = runBlocking<Unit>{
val dispatcher = newSingleThreadContext(name = "ServiceCall")
val task = GlobalScope.async {
doSomething()
}
/*
join()는 예외를 전파하지 않는다.
따라서, 따로 예외 처리를 설정해 둬야 한다.
*/
task.join()
if(task.isCancelled){
val exception = task.getCompletionExceptionOrNull()
println("Error cause: $exception")
}
println("Complete")
}
fun doSomething(){
throw UnsupportedOperationException("Can't do")
}
//await()의 경우
fun main(args : Array<String>) = runBlocking<Unit>{
val dispatcher = newSingleThreadContext(name = "ServiceCall")
val task = GlobalScope.async {
doSomething()
}
/*
await()의 경우, join()는 다르게 다른 에러를 던진다.
*/
task.await()
println("Complete")
}
fun doSomething(){
throw UnsupportedOperationException("Can't do")
}
fire-and-forget
미사일을 발사(fire)하고 나면 그후 미사일은 알아서 표적을 향해 날아가는데, 미사일에 대해 잊고 있어도(Forget) 알아서 표적에 명중한다는 것으로, 실행 후 결과에 대해서는 신경 쓸 필요 없다는 의미
//launch 블록
fun main(args : Array<String>) = runBlocking<Unit>{
val dispatcher = newSingleThreadContext(name = "ServiceCall")
val task = GlobalScope.launch {
doSomething()
}
task.join()
println("Complete")
}
fun doSomething(){
throw UnsupportedOperationException("Can't do")
}
에러를 던지고 Complete를 호출하는 결과를 확인할 수 있다.