第三章.ライフサイクルとエラー制御
ジョブとDeferred
結果非同期関数なし:Job vs結果非同期関数:Deferred
Job
//job은 예외를 던진 곳까지 전파시킨다.
fun main(args : Array<String>) = runBlocking{
val job = GlobalScope.launch {
TODO("Not Implemented")
}
delay(2000L)
}
ライフサイクル
作成(New)
fun main(args : Array<String>) = runBlocking{
val job = GlobalScope.launch(start = CoroutineStart.LAZY) {
TODO("Not Implemented")
}
delay(2000L)
}
アクティブ(Active)
fun main(args : Array<String>) : Unit = runBlocking{
val job = GlobalScope.launch(start = CoroutineStart.LAZY) {
delay(2000L)
println("Complete")
}
job.join()
}
join()はJobの完了を待つため、保留関数またはcoutinから呼び出す必要があります.fun main(args : Array<String>) {
val task = GlobalScope.launch {
delay(1000L)
println("Complete")
}
task.start()
}
出力が完了していない状態でプログラムが閉じていることを確認できます.キャンセル
キャンセル
Job
//handler 처리
fun main(args : Array<String>) = runBlocking{
val exceptionHandler = CoroutineExceptionHandler { _, throwable ->
println("Job cancelled due to ${throwable.message}")
}
GlobalScope.launch(exceptionHandler) {
TODO("Not implemented yet")
}
delay(2000L)
}
//invokeOnCompleteion 처리
fun main(args : Array<String>) = runBlocking{
GlobalScope.launch {
TODO("Not implemented yet")
}.invokeOnCompletion { cause ->
cause?.run {
println("Job Cancelled due to $this")
}
}
delay(2000L)
}
完了
Deferred
//try-catch 문으로 예외 처리가 가능하다.
fun main(args : Array<String>) : Unit = runBlocking{
val deferred = GlobalScope.async {
TODO("Not implemented yet")
}
try {
deferred.await()
}catch (e : Throwable){
println("Deferred cancelled due to ${e.message}")
}
}
そこで、CoroutineExceptionHandlerを使用するために、エラーを受信した場所にHandlerを追加します.
//에러를 전파 받는 곳에 handler를 이용한다.
fun main(args: Array<String>): Unit = runBlocking {
val exceptionHandler = CoroutineExceptionHandler{_, handler ->
println("Defered cancelled due to ${handler.message}")
}
val deferred = GlobalScope.async {
TODO("Not implemented yet")
}
GlobalScope.launch(exceptionHandler){
deferred.await()
}.join()
}
状態が一方向に動く
fun main(args: Array<String>): Unit = runBlocking {
val task = measureTimeMillis {
val job = GlobalScope.launch{
delay(2000L)
}
job.join()
//restart
job.start()
job.join()
}
println("Time: $task ms")
}
出力2秒程度の時間を確認できますリファレンス
Reference
この問題について(第三章.ライフサイクルとエラー制御), 我々は、より多くの情報をここで見つけました https://velog.io/@jms8732/3장-라이프-사이클과-에러-핸들링テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol