여러 작업을 동시에 실행하려면 "쓰레드"라는 개념을 알아야 합니다
Thread {
}
Thread {
}
쓰레드끼리는 비동기적으로 동시에 실행됩니다
Thread {
}.start()
원래는 쓰레드 뒤에 .start()를 붙여서 쓰거나
val xxx = Thread {
}
xxx.start()
[1] 변수에 쓰레드를 할당한 다음
[2] 변수.start()를 실행해야 하지만 별도 기능을 import해 이를 생략합니다
dependencies {
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.0'
}
import kotlin.concurrent.thread
kotlin.concurrent.thread는
쓰레드를 .start() 없이 실행하게 해줍니다Thread{ }
즉시 시작! 알아서 시작합니다
val xxx = Thread(start=false){ } - xxx.start()
대신 이제부터는 킵해뒀다가 나중에 쓰려면 (start=false) 조건을 붙여야합니다
(변수에 할당된) 코루틴을 실행합니다
쓰레드 내에서 1초동안 잠시 대기합니다. 대기가 끝나면 다음 코드를 실행합니다
main 함수도 쓰레드이기 때문에 밖에서도 쓸 수 있습니다
이러한 이유로 가급적 코루틴 사용을 권장합니다
launch {
}
launch {
}
코루틴끼리는 비동기적으로 동시에 실행됩니다
하지만 안정적인 코루틴 관리를 위해,
Scope내에서 코루틴을 실행하고,
job에 할당하여 관리하는 것을 권장합니다
시스템에서 이미 만들어진 공간을 쓰고 싶다면
→ GlobalScope.launch{ } 로 "글로벌스코프"에서 코루틴을 실행합니다
나만의 공간을 따로 만들어 쓰고 싶다면 → 직접 Scope 공간을 만든 후,
→ xxxScope.launch{ } 로 "xxx스코프"에서 코루틴을 실행합니다
var xxxScope = CoroutineScope(Dispatchers.Default)
▲ contaxt가 디스패쳐.Default인 코루틴스코프를 먼저 생성해야합니다
Dispatchers는 코루틴을 어떤 물리적인 쓰레드에 할당할 지 정합니다
Default와 IO, Main 등이 있지만 일단은 디폴트만 기억합시다
val job1 = GlobalScope.launch{
}
job1.join()
코루틴을 변수에 할당해서 쓰면 안정적입니다.
job으로 관리하면 나중에 . join ( )처럼 제어하기에 용이합니다
코루틴 처리가 끝날때까지 기다렸다가 → 다음 코드블럭으로 넘어갑니다
아래 코드를 마쳐야 다음 코드를 실행합니다
코루틴을 정지하고 1초동안 대기합니다. 대기가 끝나면 다음 코드를 실행합니다.
코루틴 내에서만 사용되는 메서드입니다.
val 코루틴반환값 : deffered <Int> = GlobalScope.async {
delay(1000)
return@async 5
}
launch와 달리 .async { }는 반환값을 가집니다
코루틴 반환값의 자료형은 : deffered < xxx > 입니다
이 경우 변수는 job 보다는 deffered 라고 부릅니다
return @ async로 값을 반환합니다
runBlocking {
= 코루틴반환값.await * 2
}
글자만 배웠지 문장을 쓸 줄은 모른다
갈 길이 멀지만, 그래도 개념이 헷갈리는 부분 일일이 짚어가며 꼼꼼히 익혔다...
복습하면서 100% 체득하고 넘어가자구