--개념잡기--
-코틀린의 코루틴은 비동기 프로그래밍을 처리할 수 있는 좋은 방법.
-어떠한 작업을 foreground에서 background로 또는 그 반대로 쉽게 전환하면서 처리 할 수 있다.
CoroutineScope : 코루틴의 범위, 코루틴 블록을 묶음으로 제어 할 수 있는 단위
GlobalScope : CoroutineScope의 한 종류, 미리 정의된 방식으로 프로그램 전반에 걸쳐 백그라운드에서 동작.
CoroutineContext : 코루틴을 어떻게 처리 할 것인지에 대한 여러가지 정보의 집합, 주요 요소로는 job과 dispatcher가 있음.
Dispatcher는 CoroutineContext의 주요 요소, CoroutineContext을 상속 받아, 어떤 스레드를 이용해서 어떻게 동작 할 것 인지 미리 정의해 둠.
-Dispatcher.Default : CPU 사용량이 많은 작업에 사용합니다. 주 스레드에서 작업하기에는 너무 긴 작업들에게 알맞음(백그라운드로 전환)
-Dispatcher.IO : 네트워크, 디스크 사용 할 때 사용합니다. 파일 읽고, 쓰고, 소켓을 읽고, 쓰고 작업을 멈추는 것에 최적화되어 있습니다.
-Dispatcher.Main : UI 구성하는 스레드를 메인으로 사용하는 플랫폼에서 사용 됨, 안드로이드의 경우 메인 스레드는 UI 스레드 이고, 안드로이드에서 Dispatchers.Main 은 UI 스레드를 사용하여 동작
-Dispatcher.Unconfined : 특정 목적을 위해서만 사용 됨
runBlocking : 내부 작업이 종료될 때까지 일시 중지
--사용방법--
1. 사용할 Dispatcher를 결정한다. (*어떤 스레드를 이용해서 어떻게 동작 할 것인지 미리 정의)
2. Dispatcher를 이용해서 CoroutineScope를 만든다. (*코루틴의 범위, 코루틴 블록을 묶음으로 제어 할 수 있는 단위)
3. CoroutineScope의 launch 또는 async에 수행할 코드 블록을 넘기면 됩니다.(*넘겨 받은 코드 블록으로 코루틴을 만들고 실행)
--부가설명--
launch와 async는 CoroutineScope의 확장함수이며, 넘겨 받은 코드 블록으로 코루틴을 만들고 실행해주는 코루틴 빌더입니다.
launch는 job객체를, async는 Deferred객체를 반환하며, 이 객체를 사용해서 수행 결과를 받거나 작업이 끝나기를 대기하거나, 취소하는 등의 제어가 가능합니다.
-코루틴제어-
코루틴 제어를 위한 주요 키워드 : launch, async, job, Deferred, runBlocking
launch() 함수로 시작된 코루틴 블록은 JOB 객체를 반환
val job: Job = launch {
}
job.join() // 완료대기
job.cancel() // 취소
반환 받은 Job객체로 코루틴 블록을 취소하거나, 다음 작업의 수행 전 코루틴 블록이 완료 되기를 기다릴 수 있다.
jobAll(job1, job2)
함수를 사용하여 모든 launch 코루틴 블록이 완료 되기를 기다릴 수도 있다.
----람다----
람다(Lambda)란?
-Java8부터 지원되며, 불필요한 코드를 줄이고, 가독성을 향상시키는 것을 목적으로 두고 있다.
특징
- 메소드의 매개변수로 전달될 수도 있고, 변수에 저장될 수도 있다.
- 컴파일러 추론(?nullable)에 의지하고 추론이 가능한 코드는 모두 제거해 코드를 간결하게 한다.
-기존방식
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("Thread!");
}
}).start();
-람다식
new Thread(() -> {
System.out.println("Thread!");
}).start();
> 람다 함수를 매개변수로 넘기기 위해서는 메소드의 매개변수가 @FuncationalInterface(함수인터페이스)로 선언 되어있어야 한다
----CompletableFuture----
비동기 프로그래밍의 의미는 메인쓰레드에서 분리된 쓰레드에서 동작하며 처리 완료 후 성공 혹은 실패를 메인쓰레드에 알려주는 non-blocking 코드를 의미.
GlobalScope.Future
- Future 객체는 저수준 콜백 기반 코드와 고수준 async/await 코드 간에 다리를 놓는 데 사용됩니다
- 비동기 연산의 최종결과를 나타내는 특별한 저수준 awaitable 객체.
- Future객체를 기다릴 때, 그것은 코루틴이 Future가 다른 곳에서 해결될 때까지 기다릴 것을 뜻함.
'개발언어 > Kotlin' 카테고리의 다른 글
jsoup 태그 사이 텍스트 얻기 (0) | 2022.06.24 |
---|---|
안드로이드 다중 이미지 선택 (0) | 2022.06.16 |
사진 업로드 uri to bitmap 및 Context 얻는 법 (0) | 2022.04.18 |
스위프트 메모장 만들기 1 (0) | 2021.12.16 |
스위프트 메뉴 타이틀 크기 조정 (0) | 2021.12.01 |