item 80 kyunghee - JAVA-JIKIMI/EFFECTIVE-JAVA3 GitHub Wiki
์ค๋ ๋๋ณด๋ค๋ ์คํ์, ํ์คํฌ, ์คํธ๋ฆผ์ ์ ์ฉํ๋ผ
๋จ์ํ ์์ ํ(work queue)
- ์ด ํด๋์ค์์๋ ํด๋ผ์ด์ธํธ๊ฐ ์์ฒญํ ์์ ์ ๋ฐฑ๊ทธ๋ผ์ด๋ ์ค๋ ๋์ ์์ํด ๋น๋๊ธฐ์ ์ผ๋ก ์ฒ๋ฆฌํด์คฌ๋ค.
- ์์ ํ๊ฐ ํ์ ์์ด์ง๋ฉด ํด๋ผ์ด์ธํธ๋ ํ์ ์ค๋จ์ ์์ฒญํ ์ ์๊ณ ๊ทธ๋ฌ๋ฉด ํ๋ ๋จ์ ์๋ ์์ ์ ๋ง์ ์๋ฃํ ํ ์ค์ค๋ก ์ข ๋ฃํ๋ค.
๋์์ฑ ํ๋ก๊ทธ๋๋ฐ ์ธก๋ฉด์์ ์๋ฐ๋ ์์ ๋์๊ฐ
- ์ฒ์ ๋ฆด๋ฆฌ์ฆ๋ 1996๋ ๋ถํฐ ์ค๋ ๋, ๋๊ธฐํ, wait/notify๋ฅผ ์ง์
- ์๋ฐ 5๋ถํฐ๋ ๋์์ฑ ์ปฌ๋ ์ ์ธ java.util.concurrent ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ Excutor Framework๋ฅผ ์ง์
- ์๋ฐ 7๋ถํฐ๋ ๊ณ ์ฑ๋ฅ ๋ณ๋ ฌ ๋ถํด ํ๋ ์์ํฌ์ธ ํฌํฌ-์กฐ์ธ(fork-join) ํจํค์ง๋ฅผ ์ถ๊ฐ
- ์๋ฐ 8๋ถํฐ๋ parallel ๋ฉ์๋๋ง ํ ๋ฒ ํธ์ถํ๋ฉด ํ์ดํ๋ผ์ธ์ ๋ณ๋ ฌ ์คํํ ์ ์๋ ์คํธ๋ฆผ์ ์ง์
java.util.concurrent ํจํค์ง๊ฐ ๋ฑ์ฅ
- ์ด ํจํค์ง๋ Executor framework ๋ผ๊ณ ํ๋ ์ธํฐํ์ด์ค ๊ธฐ๋ฐ์ ์ ์ฐํ ํ ์คํฌ ์คํ ๊ธฐ๋ฅ์ ๋ด๊ณ ์๋ค.
- ๋ชจ๋ ๋ฉด์์ ๋ฐ์ด๋ ์์ ํ๋ฅผ ๋ค์์ ๋จ ํ์ค๋ก ์์ฑํ ์ ์๊ฒ ๋์๋ค.
- ์๋ฐ๋ ์ค๋ ๋ ํ์ ์์ฑํ๊ณ ์ฌ์ฉํ ์ ์๋๋ก java.util.concurrent.ExecutorService ์ธํฐํ์ด์ค์ Executors ํด๋์ค ๋ฉ์๋ ์ค newCachedThreadPool๊ณผ newFixedThreadPool ๋ฉ์๋๋ฅผ ์ ๊ณตํ๊ณ ์๋ค.
ExcutorService exec = Executors.newSingleThreadExcutor();
// ๋ค์์ ์ด Excutor์ ์คํํ ํ์คํฌ(task; ์์
)๋ฅผ ๋๊ธฐ๋ ๋ฐฉ๋ฒ์ด๋ค.
exec.execute(runnable);
// ๋ค์์ Excutor๋ฅผ ์ฐ์ํ๊ฒ ์ข
๋ฃ์ํค๋ ๋ฐฉ๋ฒ์ด๋ค(์ด ์์
์ด ์คํจํ๋ฉด VM ์์ฒด๊ฐ ์ข
๋ฃ๋์ง ์์ ๊ฒ์ด๋ค)
exec.shutdown();
- ExecutorService์ ๊ธฐ๋ฅ์ ์ด ์ธ์๋ ๋ง๋ค. ๋ค์์ ExecutorService์ ์ฃผ์ ๊ธฐ๋ฅ
ํน์ ํ์คํฌ๊ฐ ์๋ฃ ๋๊ธฐ๋ฅผ ๊ธฐ๋ค๋ฆฐ๋ค. (์ฝ๋ 79-2์์ ๋ณธ get๋ฉ์๋)
ํ์คํฌ ๋ชจ์ ์ค ์๋ฌด๊ฒ ํ๋ (invokeAny ๋ฉ์๋) ํน์ ๋ชจ๋ ํ์คํฌ(invoke All ๋ฉ์๋)๊ฐ ์๋ฃ๋๊ธฐ๋ฅผ ๊ธฐ๋ค๋ฆฐ๋ค.
ExecutorService๊ฐ ์ข ๋ฃํ๊ธฐ๋ฅผ ๊ธฐ๋ค๋ฆฐ๋ค. (aWaitTermination ๋ฉ์๋).
์๋ฃ๋ ํ์คํฌ๋ค์ ๊ฒฐ๊ณผ๋ฅผ ์ฐจ๋ก๋ก ๋ฐ๋๋ค. (ExecutorCompletionService ์ด์ฉ).
ํ์คํฌ๋ฅผ ํน์ ์๊ฐ์ ํน์ ์ฃผ๊ธฐ์ ์ผ๋ก ์คํํ๊ฒ ํ๋ค. (ScheduledThreadPoolExecutor ์ด์ฉ).
ํ๋ฅผ ๋ ์ด์์ ์ค๋ ๋๊ฐ ์ฒ๋ฆฌํ๊ฒ ํ๊ณ ์ถ๋ค๋ฉด ๊ฐ๋จํ ๋ค๋ฅธ ์ ์ ํฉํฐ๋ฆฌ๋ฅผ ์ด์ฉํ์ฌ ๋ค๋ฅธ ์ข ๋ฅ์ ์คํ์ ์๋น์ค(์ค๋ ๋ ํ)๋ฅผ ์์ฑํ๋ฉด ๋๋ค.
์ค๋ ๋ ํ์ ์ค๋ ๋ ๊ฐ์๋ ๊ณ ์ ํ ์๋ ์๊ณ ํ์์ ๋ฐ๋ผ ๋์ด๋๊ฑฐ๋ ์ค์ด๋ค๊ฒ ์ค์ ํ ์๋ ์๋ค.
์ฐ๋ฆฌ์๊ฒ ํ์ํ ์คํ์ ๋๋ถ๋ถ java.util.concurrent.Executors์ ์ ์ ํฉํฐ๋ฆฌ๋ค์ ์ด์ฉํด ์์ฑํ ์ ์์ ๊ฒ์ด๋ค. ํ๋ฒํ์ง ์์ ์คํ์๋ฅผ ์ํ๋ค๋ฉด ThreadPoolExecutor ํด๋์ค๋ฅผ ์ง์ ์ฌ์ฉํด๋ ๋๋ค. ์ด ํด๋์ค๋ก๋ ์ค๋ ๋ ํ ๋์์ ๊ฒฐ์ ํ๋ ๊ฑฐ์ ๋ชจ๋ ์์ฑ์ ์ค์ ํ ์ ์๋ค.
- ExecutorService๋ฅผ ์ฌ์ฉํ๊ธฐ์ ๊น๋ค๋ก์ด ์ ํ๋ฆฌ์ผ์ด์ ๋ ์๋ค.
- ์์ ํ๋ก๊ทธ๋จ์ด๋ ๊ฐ๋ฒผ์ด ์๋ฒ๋ผ๋ฉด Executors.newCachedThreadPool์ด ์ผ๋ฐ์ ์ผ๋ก ์ข์ ์ ํ์ผ ๊ฒ์ด๋ค.
- ์ผ๋ฐ์ ์ผ๋ก ํน๋ณํ ์ค์ ํ ๊ฒ ์๊ณ ์ผ๋ฐ์ ์ธ ์ฉ๋์ ์ ํฉํ๊ฒ ๋์ํ๋ค.
- CachedThreadPool์ ๋ฌด๊ฑฐ์ด ํ๋ก๋์ ์๋ฒ์๋ ์ข์ง ๋ชปํ๋ค.
- CachedThreadPool์์๋ ์์ฒญ๋ฐ์ ํ์คํฌ๋ค์ด ํ์ ์์ด์ง ์๊ณ ์ฆ์ ์ค๋ ๋์ ์์๋ผ ์คํ๋๋ค. ๊ฐ์ฉํ ์ค๋ ๋๊ฐ ์๋ค๋ฉด ์๋ก ํ๋๋ฅผ ์์ฑํ๋ค.
- ์๋ฒ๊ฐ ์์ฃผ ๋ฌด๊ฒ๋ค๋ฉด CPU ์ด์ฉ๋ฅ ์ด 100%๋ก ์น๋ซ๊ณ ์๋ก์ด ํ์คํฌ๊ฐ ๋์ฐฉํ๋ ์กฑ์กฑ ๋ ๋ค๋ฅธ ์ค๋ ๋๋ฅผ ์์ฑํ๋ฉฐ ์ํฉ์ ๋์ฑ ์ ํ์ํจ๋ค.
์์ ํ๋ฅผ ์์ ๋ง๋๋ ์ผ์ ์ผ๊ฐ์ผํ๊ณ ์ค๋ ๋๋ฅผ ์ง์ ๋ค๋ฃจ๋ ๊ฒ๋ ์ผ๋ฐ์ ์ผ๋ก ์ผ๊ฐ์ผ ํ๋ค.
- ์ค๋ ๋๋ฅผ ์ง์ ๋ค๋ฃจ๋ฉด Thread๊ฐ ์์ ๋จ์์ ์ํ ๋งค์ปค๋์ฆ ์ญํ ์ ๋ชจ๋ ์ํํ๊ฒ ๋๋ค.
- ๋ฐ๋ฉด Executor Framework์์๋ ์์ ๋จ์์ ์คํ ๋ฉ์ปค๋์ฆ์ด ๋ถ๋ฆฌ๋๋ค.
- ์์ ๋จ์๋ฅผ ๋ํ๋ด๋ ํต์ฌ ์ถ์ ๊ฐ๋ ์ด ํ์คํฌ๋ค.
Runnable, Callable (Runnable๊ณผ ๋น์ทํ์ง๋ง ๊ฐ์ ๋ฐํํ๊ณ ์์์ ์์ธ๋ฅผ ๋์ง ์ ์๋ค.)
- Runable ๋๋ Callable ๊ตฌํ ํด๋์ค๋ก ์์ ์ ์์ฑํฉ๋๋ค. ๋์ ์ฐจ์ด๋ ์์ ์ด ๋๋ ํ ๋ฆฌํด ๊ฐ์ด ์๋ ์๋๋์ ์ฐจ์ด์ ๋๋ค.
- ํ์คํฌ๋ฅผ ์ํํ๋ ์ผ๋ฐ์ ์ธ ๋ฉ์ปค๋์ฆ์ด ๋ฐ๋ก ExcutorService์ด๋ค. ํ์คํฌ ์ํ์ ์คํ์ ์๋น์ค์ ๋งก๊ธฐ๋ฉด ์ํ๋ ํ์คํฌ ์ํ ์ ์ฑ ์ ์ ํํ ์ ์๊ณ ์๊ฐ์ด ๋ฐ๋๋ฉด ์ธ์ ๋ ๋ณ๊ฒฝํ ์ ์๋ค.
์๋ฐ 7์ด ๋๋ฉด์ Executor Framework๋ Fork-join ํ์คํฌ๋ฅผ ์ง์ํ๋๋ก ํ์ฅ
- ํฌํฌ-์กฐ์ธ ํ์คํฌ๋ ํฌํฌ-์กฐ์ธ ํ์ด๋ผ๋ ํน๋ณํ ์คํ์ ์๋น์ค๊ฐ ์คํํด์ค๋ค.
- ํฌํฌ-์กฐ์ธ ํ์คํฌ, ์ฆ ForkJoinTask์ ์ธ์คํด์ค๋ ์์ ํ์ ํ์คํฌ๋ก ๋๋ ์ ์๊ณ , ForkJoinPool์ ๊ตฌ์ฑํ๋ ์ค๋ ๋๋ค์ด ์ด ํ์คํฌ๋ค์ ์ฒ๋ฆฌํ๋ฉฐ ์ผ์ ๋จผ์ ๋๋ธ ์ค๋ ๋๋ ๋ค๋ฅธ ์ค๋ ๋์ ๋จ์ ํ์คํฌ๋ฅผ ๊ฐ์ ธ์ ๋์ ์ฒ๋ฆฌํ ์๋ ์๋ค.
- ์ด๋ ๊ฒํ์ฌ ๋ชจ๋ ์ค๋ ๋๊ฐ ๋ฐ์๊ฒ ์์ง์ฌ CPU๋ฅผ ์ต๋ํ ํ์ฉํ๋ฉด์ ๋์ ์ฒ๋ฆฌ๋๊ณผ ๋ฎ์ ์ง์ฐ์๊ฐ์ ๋ฌ์ฑํ๋ค.
ํต์ฌ ์ ๋ฆฌ
๋ณ๋ ฌ ์คํธ๋ฆผ(์์ดํ
48: ์คํธ๋ฆผ ๋ณ๋ ฌํ)์ ์ด์ฉํ๋ฉด ์ ์ ๋
ธ๋ ฅ์ผ๋ก ๊ทธ ์ด์ ์ ์ป์ ์ ์๋ค.
๋์์ฑ ํ๋ก๊ทธ๋๋ฐ์ ํ ๋๋ ์์ ์ฑ๊ณผ ์๋ต๊ฐ๋ฅ ์ํ๋ฅผ ์ ์งํ๊ธฐ ์ํด ์ ์จ์ผ ํ๋ค. (์์ดํ
48)