2022. 4. 11. 15:12ใJAVA/study
1๏ธโฃ Concurrent ์ํํธ์จ์ด ๋?
๋์์ ์ฌ๋ฌ ์์ ์ ํ ์ ์๋ ์ํํธ์จ์ด
์) ์น ๋ธ๋ผ์ฐ์ ๋ก ์ ํ๋ธ๋ฅผ ๋ณด๋ฉด์ ํค๋ณด๋๋ก ๋ฌธ์์ ํ์ดํ์ ํ ์ ์๋ค.
์) ๋ นํ๋ฅผ ํ๋ฉด์ IntelliJ๋ก ์ฝ๋ฉ์ ํ๊ณ ์๋์ ์ ์ด๋ ๋ฌธ์๋ฅผ ๋ณด๊ณ ๋ ์์ ํ ์ ์๋ค.
2๏ธโฃ ์๋ฐ์์ ์ง์ํ๋ Concurrent ํ๋ก๊ทธ๋๋ฐ
: ๋ฉํฐ ํ๋ก์ธ์ฑ(ProcessBuilder), ๋ฉํฐ ์ฐ๋ ๋
3๏ธโฃ ์๋ฐ ๋ฉํฐ์ฐ๋ ๋ ํ๋ก๊ทธ๋๋ฐ
Thread/ Runnable
- ์ฐ๋ ๋๋ฅผ ์์ฑํ๋ ๋ฐฉ๋ฒ
Thread ์์๋ฐ์์ ๊ตฌํ
Runnable ๊ตฌํ ๋๋ ๋๋ค
- ์ฐ๋ ๋์ ์ฃผ์ ๊ธฐ๋ฅ
ํ์ฌ ์ฐ๋ ๋ ๋ฉ์ถฐ๋๊ธฐ (sleep)
๋ค๋ฅธ ์ฐ๋ ๋ ๊นจ์ฐ๊ธฐ (interrupt)
๋ค๋ฅธ ์ฐ๋ ๋ ๊ธฐ๋ค๋ฆฌ๊ธฐ (join)
4๏ธโฃ Executors
: ๊ณ ์์คHigh-Level Concurrency ํ๋ก๊ทธ๋๋ฐ
์ฐ๋ ๋๋ฅผ ๋ง๋ค๊ณ ๊ด๋ฆฌํ๋ ์์ ์ ์ ํ๋ฆฌ์ผ์ด์ ์์ ๋ถ๋ฆฌ
๊ทธ๋ฐ ๊ธฐ๋ฅ์ executors์๊ฒ ์์
-> Runnable๊ฐ์๊ฑด low-level์ด๋ผ๊ณ ํจ..
Executor Service๋ ๋ณ๋ ฌ ์์ ์ ์ฌ๋ฌ ๊ฐ์ ์์ ์ ํจ์จ์ ์ผ๋ก ์ฒ๋ฆฌํ๊ธฐ ์ํด ์ ๊ณต๋๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
Java์์ ์ฐ๋ ๋ํ์ ์์ฑํด์ ์ฌ์ฉํ๊ณ ์ ํ ๋ ์ฐ๋ ์ ํธ ํด๋์ค
ExecutorService์ Task๋ง ์ง์ ํด์ฃผ๋ฉด ์น์ ํ๊ฒ ์์์ ThreadPool์ ์ด์ฉํด์ Task๋ฅผ ์คํํ๊ณ ๊ด๋ฆฌํด์ค๋ค.
5๏ธโฃ Executors๊ฐ ํ๋ ์ผ
์ฐ๋ ๋ ๋ง๋ค๊ธฐ : ์ ํ๋ฆฌ์ผ์ด์ ์ด ์ฌ์ฉํ ์ฐ๋ ๋ ํ์ ๋ง๋ค์ด ๊ด๋ฆฌํ๋ค.
์ฐ๋ ๋ ๊ด๋ฆฌ : ์ฐ๋ ๋ ์๋ช ์ฃผ๊ธฐ๋ฅผ ๊ด๋ฆฌํ๋ค.
์์ ์ฒ๋ฆฌ ๋ฐ ์คํ : ์ฐ๋ ๋๋ก ์คํํ ์์ ์ ์ ๊ณตํ ์ ์๋ API๋ฅผ ์ ๊ณตํ๋ค.
6๏ธโฃ ์ฃผ์ ์ธํฐํ์ด์ค
Executors : execute(Runnable)
-> ExecutorService : Executor ์์๋ฐ์ ์ธํฐํ์ด์ค๋ก, Callable๋ ์คํํ ์ ์์ผ๋ฉฐ, Executor๋ฅผ ์ข ๋ฃ ์ํค๊ฑฐ๋, ์ฌ๋ฌ Callable์ ๋์์ ์คํํ๋ ๋ฑ์ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ค.
-> ScheduledExecutorService : ExecutorService๋ฅผ ์์๋ฐ์ ์ธํฐํ์ด์ค๋ก ํน์ ์๊ฐ ์ดํ์ ๋๋ ์ฃผ๊ธฐ์ ์ผ๋ก ์์ ์ ์คํํ ์ ์๋ค.
์ข ๋ฅ
FixedThreadPool : ๊ณ ์ ๋ ๊ฐฏ์๋ฅผ ๊ฐ์ง ์ฐ๋ ๋ํ -> ์ด๋ฅผ ์ฌ์ฉํ ๋ ํด๋น ๋จธ์ ์ cpu ์ฝ์ด์๋ฅผ ๊ธฐ์ค์ผ๋ก ์์ฑํ๋ฉด ๋ ์ข์ ํผํฌ๋จผ์ค๋ฅผ ์ป์ ์ ์๋ค.
CachedThreadPool : ์ฐ๋ ๋๋ฅผ ์บ์ฑํ๋ ์ฐ๋ ๋ํ -> ์ผ์ ์๊ฐ ๋์ ์ฐ๋ ๋๋ฅผ ๊ฒ์ฌํ์ฌ 60์ด ๋์ ์์ ์ด ์์ผ๋ฉด pool ์์ ์ ๊ฑฐํ๋ค.
ScheduledThreadPool : 1๋ถ์ ํ๋ฒ์ ์๋ฌด๋ฅผ ์ํ์ํค๊ธฐ ์ํ ์ฐ๋ ๋ํ
SingleThreadExecutor : ํ ๊ฐ์ ์ฐ๋ ๋๋ก ์์ ์ ์ฒ๋ฆฌํ๋ ์ฐ๋ ๋ํ
ForkJoin Pool : ํฐ ์ ๋ฌด๋ฅผ ์์ ์ ๋ฌด๋ก ๋๋์ด ๋ฐฐ๋ถํด์, ์ผ์ ํ ํ์ ์ผ์ ์ทจํฉํ๋ ํํ
-> Task์ ํฌ๊ธฐ์ ๋ฐ๋ผ ๋ถํ (fork) ํ๊ณ ๋ถํ ๋ task๊ฐ ์ฒ๋ฆฌ๋๋ฉด ๊ทธ๊ฒ์ ํฉ์ณ join ๋ฆฌํดํด์ค๋ค.
7๏ธโฃ Fork/Join ํ๋ ์์ํฌ
ExecutorService์ ๊ตฌํ์ฒด๋ก ์์ฝ๊ฒ ๋ฉํฐ ํ๋ก์ธ์๋ฅผ ํ์ฉํ ์ ์๊ฒ๋ ๋์์ค๋ค.
java์์ ์ฐ๋ ๋ํ์ ์์ฑํด์ ์ฌ์ฉํ๊ณ ์ ํ ๋ ์ฐ๋ ์ ํธ ํด๋์ค
-> ์ ํธ ํด๋์ค๋ ์ธ์คํด์ค ๋ฉ์๋์ ์ธ์คํด์ค ๋ณ์๋ฅผ ์ผ์ ์ ๊ณตํ์ง ์๊ณ , ์ ์ ๋ฉ์๋์ ๋ณ์๋ง์ ์ ๊ณตํ๋ ํด๋์ค๋ฅผ ๋งํ๋ค.
-> ๋น์ทํ ๊ธฐ๋ฅ์ ๋ฉ์๋์ ์์๋ฅผ ๋ชจ์์ ์บก์ํํ๊ฒ์ด ์ ํธ๋ฆฌํฐ ํด๋์ค์ด๋ค.
-> ๊ด๋ จ๋ ๋ฉ์๋๋ค๋ผ๋ฆฌ ๋ชจ์์ ํด๋์ค๋ก ๋ง๋๋ ๊ฒฝ์ฐ์ ์ค๋ณต๋ ์ฝ๋๊ฐ ๋ฐ์ํ์ง ์๊ณ ํจ์จ์ ์ผ๋ก ๊ด๋ฆฌํ ์ ์๋ค.
8๏ธโฃ Callable๊ณผ Future
Callable : Runnable๊ณผ ์ ์ฌํ์ง๋ง ์์ ์ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ์ ์ ์๋ค.
Future : ๋น๋๊ธฐ์ ์ธ ์์ ์ ํ์ฌ ์ํ๋ฅผ ์กฐํํ๊ฑฐ๋ ๊ฒฐ๊ณผ๋ฅผ ๊ฐ์ ธ์ฌ ์ ์๋ค.
- ๊ฒฐ๊ณผ ๊ฐ์ ธ์ค๊ธฐ get
-> submit() : ์์ ์ฒ๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ์ ์ ์๋๋ก Future๋ฅผ ๋ฆฌํดํ๋ค.
submit()๋ ์์ ์ฒ๋ฆฌ ๋์ค์ ์์ธ๊ฐ ๋ฐ์ํ๋๋ผ๋ ์ค๋ ๋๋ ์ข ๋ฃ๋์ง ์๊ณ ๋ค์ ์์ ์ ์ํด ์ฌ์ฌ์ฉ๋๋ค.
-> ๋ธ๋กํน ์ฝ
-> ํ์ ์์(์ต๋ํ์ผ๋ก ๊ธฐ๋ค๋ฆด ์๊ฐ)์ ์ค์ ํ ์ ์๋ค.
โ Blocking, Non-Blocking
: Blocking๊ณผ Non-Blocking์ ๋๊ธฐ์ ๋น๋๊ธฐ์ ์ํด ๋ฐ์ํ๋ค.
Blocking์ ๋๊ธฐ์ ์ฒ๋ฆฌ๊ฐ ๋์์ ๊ฒฝ์ฐ ๋ฐ์ํ๋ค. (๋๊ธฐ์ ์ฒ๋ฆฌ๋ ์์ ์ ์์๋๋ก ํ๋์ฉ ์ฒ๋ฆฌํ๋ ๋ฐฉ์์ผ๋ก ํ์ฌ ์์ ์ด ์ข ๋ฃ๋๋ฉด ๋ค์ ์์ ์ด ์ฒ๋ฆฌ๋๋ค.)
-> A ์์ ์ ์ฒ๋ฆฌํ๋ ์๊ฐ์ด ๊ธธ์ด์ง๋ฉด ๋ค์ ์์ ์ธ B๊ฐ ๋๊ธฐํ๋ ์๊ฐ์ด ๊ธธ์ด์ง๋ค. ์ด๋ B๋ A ์คํ์ด ์ข ๋ฃ๋ ์ดํ ํธ์ถ๋๋๋ฐ B๋ A์ ์ํด Blocking ๋์๋ค๋ผ๊ณ ๋งํ ์ ์๋ค.
Non-Blocking ์ ๋น๋๊ธฐ์ ์ฒ๋ฆฌ๊ฐ ๋์์ ๋ ๋ฐ์ํ๋ค. Blocking ๊ณผ๋ ๋ฐ๋๋ก ํ๋์ ์์ ์ด ์ข ๋ฃ๋ ๋๊น์ง ๋ค์ ์์ ์ด ๋๊ธฐํ๋ ๊ฒ์ด ์๋๊ณ , ํ๋์ ์์ ์ด ์คํํ๋ ๋์์ ๋ค์ ์์ ์ด ํธ์ถ๋๋ค.
- ์์ ์ํ ํ์ธํ๊ธฐ isDone() : ์์ ์ ์๋ฃ ํ์ผ๋ฉด true, ์๋๋ฉด false
- ์์ ์ทจ์ํ๊ธฐ cancle() : ์ทจ์ ํ์ผ๋ฉด true, ๋ชปํ์ผ๋ฉด false๋ฅผ ๋ฆฌํดํ๋ค.
-> ํ๋ผ๋ฏธํฐ๋ก true๋ฅผ ์ ๋ฌํ๋ฉด ํ์ฌ ์งํ์ค์ธ ์ฐ๋ ๋๋ฅผ interrupt ํ๊ณ , ๊ทธ๋ ์ง ์์ผ๋ฉด ํ์ฌ ์งํ์ค์ธ ์์ ์ด ๋๋ ๋๊น์ง ๊ธฐ๋ค๋ฆฐ๋ค.
- ์ฌ๋ฌ ์์ ๋์์ ์คํํ๊ธฐ invokeAll : ๋์์ ์คํํ ์์ ์ค์ ์ ์ผ ์ค๋ ๊ฑธ๋ฆฌ๋ ์์ ๋งํผ ์๊ฐ์ด ๊ฑธ๋ฆฐ๋ค.
- ์ฌ๋ฌ ์์ ์ค์ ํ๋๋ผ๋ ๋จผ์ ์๋ต์ด ์ค๋ฉด ๋๋ด๊ธฐ invokeAny() : ๋์์ ์คํํ ์์ ์ค์ ์ ์ผ ์งง๊ฒ ๊ฑธ๋ฆฌ๋ ์์ ๋งํผ ์๊ฐ์ด ๊ฑธ๋ฆฐ๋ค. -> ๋ธ๋กํน ์ฝ
9๏ธโฃ CompletableFuture
: ์๋ฐ์์ ๋น๋๊ธฐ ํ๋ก๊ทธ๋๋ฐ์ ๊ฐ๋ฅํ๊ฒ ํ๋ ์ธํฐํ์ด์ค
๋ฌผ๋ก Future์์ ์ด๋์ ๋ ๋น๋๊ธฐ ํ๋ก๊ทธ๋๋ฐ์ด ๊ฐ๋ฅํ์ง๋ง ์๋๋ ๋ถ๋ถ๋ค์ด ๊ฝค ์๋ค.
- Future๋ฅผ ์ธ๋ถ์์ ์๋ฃ ์ํฌ ์ ์๋ค. ์ทจ์ํ๊ฑฐ๋ get์ ํ์์์์ ์ค์ ํ ์๋ ์๋ค.
- ๋ธ๋กํน ์ฝ๋(get()๋ฅผ ์ฌ์ฉํ์ง ์๊ณ ์๋ ์์ ์ด ๋๋ฌ์ ๋ ์ฝ๋ฐฑ์ ์คํํ ์ ์๋ค.)
- ์ฌ๋ฌ Future๋ฅผ ์กฐํฉํ ์ ์๋ค. → Event ์ ๋ณด๋ฅผ ๊ฐ์ ธ์จ ๋ค์ Event์ ์ฐธ์ํ๋ ํ์ ๋ชฉ๋ก ๊ฐ์ ธ์ค๊ธฐ
- ์์ธ ์ฒ๋ฆฌ์ฉ api๋ฅผ ์ ๊ณตํ์ง ์๋๋ค.
๋น๋๊ธฐ๋ก ์์ ์คํํ๊ธฐ
- ๋ฆฌํด๊ฐ์ด ์๋ ๊ฒฝ์ฐ runAsync()
- ๋ฆฌํด๊ฐ์ด ์๋ ๊ฒฝ์ฐ supplyAsync()
์ฝ๋ฐฑ ์ ๊ณตํ๊ธฐ
- thenApply(Function) : ๋ฆฌํด๊ฐ์ ๋ฐ์์ ๋ค๋ฅธ ๊ฐ์ผ๋ก ๋ฐ๊พธ๋ ์ฝ๋ฐฑ
- thenAccept(Consumer<T>) : ๋ฆฌํด๊ฐ์ ๋ฐ์์ ๋ค๋ฅธ ์์ ์ ์ฒ๋ฆฌํ๋ ์ฝ๋ฐฑ (๋ฆฌํด ์์)
- thenRun(Runnable) : ๋ฆฌํด๊ฐ ๋ฐ์ ๋ค๋ฅธ ์์ ์ ์ฒ๋ฆฌํ๋ ์ฝ๋ฐฑ
-> thenRun ํจ์๋ ๊ฒฐ๊ณผ๊ฐ, return ๊ฐ ๋ชจ๋ ํ์ ์๋ค๋ฉด Runnable ์ ๋งค๊ฐ๋ณ์๋ก ๋ฐ๋๋ค.
์กฐํฉํ๊ธฐ
thenCompose() : ๋ ์์ ์ด ์๋ก ์ด์ด์ ์คํํ๋๋ก ์กฐํฉ
thenCombine() : ๋ ์์ ์ ๋ ๋ฆฝ์ ์ผ๋ก ์คํํ๊ณ ๋ ๋ค ์ข ๋ฃ ํ์ ๋ ์ฝ๋ฐฑ ์คํ
allOf() : ์ฌ๋ฌ ์์ ์ ๋ชจ๋ ์คํํ๊ณ ๋ชจ๋ ์์ ๊ฒฐ๊ณผ์ ์ฝ๋ฐฑ ์คํ
anyOf() : ์ฌ๋ฌ ์์ ์ค์ ๊ฐ์ฅ ๋นจ๋ฆฌ ๋๋ ํ๋์ ๊ฒฐ๊ณผ์ ์ฝ๋ฐฑ ์คํ
์์ธ ์ฒ๋ฆฌ
exceptionally(Function)
handle(BiFunction)
'JAVA > study' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[JAVA] ๋ ์๋ฐ, Java 8 ์ ๋ ธํ ์ด์ ๋ณํ, ๋ฐฐ์ด Parallel ์ ๋ ฌ, Metaspace (0) | 2022.04.11 |
---|---|
[JAVA] ๋ ์๋ฐ, Java 8 Date์ Time API (0) | 2022.04.11 |
[JAVA] ๋ ์๋ฐ, Java 8 Optional (0) | 2022.04.11 |
[JAVA] ๋ ์๋ฐ, Java 8 Stream (0) | 2022.04.06 |
[JAVA] ๋ ์๋ฐ, Java 8 ์ธํฐํ์ด์ค ๋ณํ (0) | 2022.04.06 |