# 자바 동시성 프로그래밍 - 비동기 프로그래밍

## thenAccept\[Async] ()

![img\_63.png](https://2900387690-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FOjEy54f4ToLNl5n9gmZs%2Fuploads%2Fgit-blob-dd63bf73f177cd27f1de37409cd466ffbafedd42%2Fimg_63.png?alt=media)

* **개념**
  * 인스턴스 메서드로서 (비)동기적으로 작업의 결과를 소비하고 추가 수행을 한다.
* **인수 값**
  * `Consumer<T>` 함수를 인수로 받고 작업을 수행한다.
* **반환 값**
  * 새로운 `CompletableFuture<T>` 객체를 반환한다.
* **실행 객체**
  * `UniAccept`

![img\_64.png](https://2900387690-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FOjEy54f4ToLNl5n9gmZs%2Fuploads%2Fgit-blob-b58d4aab6d2351238b629be1af9a13c4afac883b%2Fimg_64.png?alt=media)

![img\_65.png](https://2900387690-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FOjEy54f4ToLNl5n9gmZs%2Fuploads%2Fgit-blob-6a96c071f3c82cc2c26ff14ebdaa100d7130b698%2Fimg_65.png?alt=media)

![img\_66.png](https://2900387690-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FOjEy54f4ToLNl5n9gmZs%2Fuploads%2Fgit-blob-d8a6a35f3b630b7407d2f9bf5de71df75ed3f01c%2Fimg_66.png?alt=media)

### thenAccept\[Async] () 흐름도

![img\_67.png](https://2900387690-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FOjEy54f4ToLNl5n9gmZs%2Fuploads%2Fgit-blob-ae96ae52f615c9518e92d5b6525c0ab7e591ba5f%2Fimg_67.png?alt=media)

> * `thenAcceptAsync()`는 이전 작업 결과와 상관없이 무조건 풀 스레드에서 비동기 처리된다. 풀 스레드는 이전과 동일한 스레드가 될 수도 있고 새롭게 생성된 스레드가 될 수도 있다.
> * `thenAccept()`는 이전 작업 결과가 완료되었다면 메인 스레드에서 동기 처리되고, 그렇지 않으면 이전과 동일한 스레드에서 비동기 처리된다.

### thenAccept\[Async] () 예제 코드

![img\_72.png](https://2900387690-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FOjEy54f4ToLNl5n9gmZs%2Fuploads%2Fgit-blob-da53b49e332f953477151086259d568554fba590%2Fimg_72.png?alt=media)

![img\_73.png](https://2900387690-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FOjEy54f4ToLNl5n9gmZs%2Fuploads%2Fgit-blob-8018c79f5d3295c0ea67f9d55cdfd7cbd1f7679a%2Fimg_73.png?alt=media)

***

## thenRun\[Async] ()

![img\_68.png](https://2900387690-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FOjEy54f4ToLNl5n9gmZs%2Fuploads%2Fgit-blob-aa39fa570f3c5d3b019929d7aa98d39fbfbbafa3%2Fimg_68.png?alt=media)

* **개념**
  * 인스턴스 메서드로서 (비)동기적으로 이전 결과를 무시하고 단순한 후속 작업을 수행한다.
* **인수 값**
  * `Runnable` 함수를 인수로 받고 작업을 수행한다.
* **반환 값**
  * 새로운 `CompletableFuture<T>` 객체를 반환한다.
* **실행 객체**
  * `UniRun`

![img\_69.png](https://2900387690-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FOjEy54f4ToLNl5n9gmZs%2Fuploads%2Fgit-blob-771327cd325529d01cda62da9218c5acc173efb1%2Fimg_69.png?alt=media)

![img\_70.png](https://2900387690-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FOjEy54f4ToLNl5n9gmZs%2Fuploads%2Fgit-blob-ab2bdbcb266588e7bba58e3d6be349d635f67d34%2Fimg_70.png?alt=media)

### thenRun\[Async] () 흐름도

![img\_71.png](https://2900387690-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FOjEy54f4ToLNl5n9gmZs%2Fuploads%2Fgit-blob-a7db9d4400c2af01a40a7e1bdddb1fdafbace251%2Fimg_71.png?alt=media)

> * `thenRunAsync()`는 이전 작업 결과와 상관없이 무조건 풀 스레드에서 비동기 처리된다. 풀 스레드는 이전과 동일한 스레드가 될 수도 있고 새롭게 생성된 스레드가 될 수도 있다.
> * `thenRun()`는 이전 작업 결과가 완료되었다면 메인 스레드에서 동기 처리되고, 그렇지 않으면 이전과 동일한 스레드에서 비동기 처리된다.

### thenRun\[Async] () 예제 코드

![img\_74.png](https://2900387690-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FOjEy54f4ToLNl5n9gmZs%2Fuploads%2Fgit-blob-f81581e8fb771f95e2f127c28c1510e66b2970c5%2Fimg_74.png?alt=media)

![img\_75.png](https://2900387690-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FOjEy54f4ToLNl5n9gmZs%2Fuploads%2Fgit-blob-bf8fde2e7912d198fb6f6a85a56b97b6001e7d39%2Fimg_75.png?alt=media)

***

## CompletableFuture Pipeline

* 체인으로 연결된 `CompletableFuture`의 각 작업은 이전 작업이 완료된 다음 실행하는 Pipeline 으로 구성된다.
* Pipeline 으로 구성된 `CompletableFuture`는 해당 작업이 완료되면 다음 작업을 호출하는 구조이기 때문에 비록 비동기 작업이라 하더라도 동시가 아닌 순차적으로 처리된다.
* 모든 작업이 동시적으로 실행되기 위해서는 `CompletableFuture`간 의존 관계를 최소화 혹은 제거해야 하고 각 작업을 독립적으로 설계해야 가능하다.

![img\_76.png](https://2900387690-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FOjEy54f4ToLNl5n9gmZs%2Fuploads%2Fgit-blob-fbc4b5b0134b5d0b59b872ce143ef2101c105873%2Fimg_76.png?alt=media)

![img\_77.png](https://2900387690-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FOjEy54f4ToLNl5n9gmZs%2Fuploads%2Fgit-blob-b70cc076a9755808535a808921d5df31c10dac94%2Fimg_77.png?alt=media)

***

[이전 ↩️ - 비동기 프로그래밍 - 비동기 결과 조작(`thenApply()` & `thenApplyAsync()`)](https://github.com/genesis12345678/TIL/blob/main/Java/reactive/AsyncProgramming/thenApplyAsync.md)

[메인 ⏫](https://github.com/genesis12345678/TIL/blob/main/Java/reactive/Main.md)

[다음 ↪️ - 비동기 프로그래밍 - 비동기 작업 조합(`thenCompose()` & `thenCombine()`)](https://github.com/genesis12345678/TIL/blob/main/Java/reactive/AsyncProgramming/thenCombine.md)
