반응형

--개념잡기--

-코틀린의 코루틴은 비동기 프로그래밍을 처리할 수 있는 좋은 방법.
-어떠한 작업을 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가 다른 곳에서 해결될 때까지 기다릴 것을 뜻함.




반응형

+ Recent posts