Kotlin 문법 종합반 #4下. 쓰레드와 코루틴

·2024년 6월 14일
0

쓰레드

  • 동기 : 메인 함수에서 코드를 순서대로 실행
  • 비동기 : 여러 쓰레드를 병렬로 동시에 실행

여러 작업을 동시에 실행하려면 "쓰레드"라는 개념을 알아야 합니다


Thread { }

Thread {
}
Thread {
}

쓰레드끼리는 비동기적으로 동시에 실행됩니다

Thread {
}.start()

원래는 쓰레드 뒤에 .start()를 붙여서 쓰거나

val xxx = Thread {
}

xxx.start()

[1] 변수에 쓰레드를 할당한 다음
[2] 변수.start()를 실행해야 하지만 별도 기능을 import해 이를 생략합니다


[준비하기]

1. 외부 종속성 추가

dependencies {
    implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.0'
}
  • GrandleScript > build.grandle (Module.app)에
    implementation을 추가하고 Sync Now를 클릭

2. 관련 기능 import

import kotlin.concurrent.thread
  • main()함수 상단에 관련 기능을 import 합니다

kotlin.concurrent.thread는
쓰레드를 .start() 없이 실행하게 해줍니다

Thread{
}

즉시 시작! 알아서 시작합니다

val xxx = Thread(start=false){
}
-
xxx.start()

대신 이제부터는 킵해뒀다가 나중에 쓰려면 (start=false) 조건을 붙여야합니다


코루틴.start( )

(변수에 할당된) 코루틴을 실행합니다

Thread.sleep(100)

쓰레드 내에서 1초동안 잠시 대기합니다. 대기가 끝나면 다음 코드를 실행합니다
main 함수도 쓰레드이기 때문에 밖에서도 쓸 수 있습니다


코루틴

쓰레드

  • 스택 메모리에, 하드웨어 적으로 따로따로 할당합니다
  • 쓰레드 간에 정보를 유기적으로 교환하기 비교적 빡셉니다
  • UI - 네트워크 등 context를 전환할 때 비교적 빡셉니다

코루틴

  • 하나의 쓰레드에서 소프트웨어 적으로 분할해 실행합니다
  • 코루틴 간 정보교환, context 전환이 쉽습니다

이러한 이유로 가급적 코루틴 사용을 권장합니다


launch{ }

launch {
}
launch {
}

코루틴끼리는 비동기적으로 동시에 실행됩니다
하지만 안정적인 코루틴 관리를 위해,

Scope내에서 코루틴을 실행하고,
job에 할당하여 관리하는 것을 권장합니다


Scope는 코루틴이 입력되는 공간입니다

시스템에서 이미 만들어진 공간을 쓰고 싶다면
GlobalScope.launch{ } 로 "글로벌스코프"에서 코루틴을 실행합니다

나만의 공간을 따로 만들어 쓰고 싶다면 → 직접 Scope 공간을 만든 후,
xxxScope.launch{ } 로 "xxx스코프"에서 코루틴을 실행합니다

CoroutineScope 만들기

var xxxScope =  CoroutineScope(Dispatchers.Default)

▲ contaxt가 디스패쳐.Default인 코루틴스코프를 먼저 생성해야합니다

Dispatchers는 코루틴을 어떤 물리적인 쓰레드에 할당할 지 정합니다
Default와 IO, Main 등이 있지만 일단은 디폴트만 기억합시다


코루틴이 할당된 변수는 job이라고 부릅니다.

val job1 = GlobalScope.launch{
}

job1.join()

코루틴을 변수에 할당해서 쓰면 안정적입니다.
job으로 관리하면 나중에 . join ( )처럼 제어하기에 용이합니다


잡 . join ( )

코루틴 처리가 끝날때까지 기다렸다가 → 다음 코드블럭으로 넘어갑니다


runBlocking { 코드 }

아래 코드를 마쳐야 다음 코드를 실행합니다


delay(100)

코루틴을 정지하고 1초동안 대기합니다. 대기가 끝나면 다음 코드를 실행합니다.
코루틴 내에서만 사용되는 메서드입니다.


. async { }

val 코루틴반환값 : deffered <Int> = GlobalScope.async {
	delay(1000)
    return@async 5
}
  • launch와 달리 .async { }는 반환값을 가집니다
    코루틴 반환값의 자료형은 : deffered < xxx > 입니다
    이 경우 변수는 job 보다는 deffered 라고 부릅니다

  • return @ async로 값을 반환합니다

. await

runBlocking {
	 = 코루틴반환값.await * 2
}
  • runBlocking으로 { } 내 코드를 실행할 때까지 잠시 기다립니다
  • . await로 코루틴이 반환을 마칠 때까지 기다렸다가 값을 받아옵니다

코틀린 기초문법 다 뗐다!!!!!!!!!!

글자만 배웠지 문장을 쓸 줄은 모른다
갈 길이 멀지만, 그래도 개념이 헷갈리는 부분 일일이 짚어가며 꼼꼼히 익혔다...

복습하면서 100% 체득하고 넘어가자구

profile
디자이너의 개발 창업 도전기

0개의 댓글