item 80 incheol - JAVA-JIKIMI/EFFECTIVE-JAVA3 GitHub Wiki
์ค๋ ๋๋ณด๋ค๋ ์คํ์, ํ์คํฌ, ์คํธ๋ฆผ์ ์ ์ฉํ๋ผ
java.util.concurrent ํจํค์ง๋ ์คํ์ ํ๋ ์์ํฌ๋ผ๊ณ ํ๋ ์ธํฐํ์ด์ค ๊ธฐ๋ฐ์ ์ ์ฐํ ํ์คํฌ ์คํ ๊ธฐ๋ฅ์ ๋ด๊ณ ์๋ค.
// ์์
ํ๋ฅผ ์์ฑํ๋ค.
ExcutorService exec = Executors.newSingleThreadExcutor();
// ๋ค์์ ์ด Excutor์ ์คํํ ํ์คํฌ(task; ์์
)๋ฅผ ๋๊ธฐ๋ ๋ฐฉ๋ฒ์ด๋ค.
exec.execute(runnable);
// ๋ค์์ Excutor๋ฅผ ์ฐ์ํ๊ฒ ์ข
๋ฃ์ํค๋ ๋ฐฉ๋ฒ์ด๋ค(์ด ์์
์ด ์คํจํ๋ฉด VM ์์ฒด๊ฐ ์ข
๋ฃ๋์ง ์์ ๊ฒ์ด๋ค)
exec.shutdown();
์คํ์ ์๋น์ค์ ๊ธฐ๋ฅ์ ์ด ์ธ์๋ ๋ง๋ค.
์คํ์ ์๋น์ค์ ์ฃผ์ ๊ธฐ๋ฅ
- ํน์ ํ์คํฌ๊ฐ ์๋ฃ๋๊ธฐ๋ฅผ ๊ธฐ๋ค๋ฆฐ๋ค.
- ํ์คํฌ ๋ชจ์ ์ค ์๋ฌด๊ฒ ํ๋(invokeAny ๋ฉ์๋) ํน์ ๋ชจ๋ ํ์คํฌ(invokeALL ๋ฉ์๋)๊ฐ ์๋ฃ๋๊ธฐ๋ฅผ ๊ธฐ๋ค๋ฆฐ๋ค.
- ์คํ์ ์๋น์ค๊ฐ ์ข ๋ฃํ๊ธฐ๋ฅผ ๊ธฐ๋ค๋ฆฐ๋ค(awaitTermination ๋ฉ์๋)
- ์๋ฃ๋ ํ์คํฌ๋ค์ ๊ฒฐ๊ณผ๋ฅผ ์ฐจ๋ก๋ก ๋ฐ๋๋ค(ExecutorCompletionService ์ด์ฉ)
- ํ์คํฌ๋ฅผ ํน์ ์๊ฐ์ ํน์ ์ฃผ๊ธฐ์ ์ผ๋ก ์คํํ๊ฒ ํ๋ค(ScheculedThread PoolExecutor ์ด์ฉ)
๊ทธ ์ธ ๊ธฐ๋ฅ
- ํ๋ฅผ ๋ ์ด์์ ์ค๋ ๋๊ฐ ์ฒ๋ฆฌํ๊ฒ ํ๊ณ ์ถ๋ค๋ฉด ๊ฐ๋จํ ๋ค๋ฅธ ์ ์ ํฉํฐ๋ฆฌ๋ฅผ ์ด์ฉํ์ฌ ๋ค๋ฅธ ์ข ๋ฅ์ ์คํ์ ์๋น์ค(์ค๋ ๋ ํ)๋ฅผ ์์ฑํ๋ฉด ๋๋ค.
- ํ๋ฒํ์ง ์์ ์คํ์๋ฅผ ์ํ๋ค๋ฉด ThreadPoolExecutor ํด๋์ค๋ฅผ ์ง์ ์ฌ์ฉํด๋ ๋๋ค. ์ด ํด๋์ค๋ก๋ ์ค๋ ๋ ํ ๋์์ ๊ฒฐ์ ํ๋ ๊ฑฐ์ ๋ชจ๋ ์์ฑ์ ์ค์ ํ ์ ์๋ค. ex) new ThreadPoolExecutor(1, 3 ,3, SECONDS, queue);
- ์์ ํ๋ก๊ทธ๋จ์ด๋ ๊ฐ๋ฒผ์ด ์๋ฒ๋ผ๋ฉด Executors.newCachedThreadPool์ ์ฌ์ฉํ๋ผ. ํน๋ณํ ์ค์ ํ ๊ฒ ์๊ณ ์ผ๋ฐ์ ์ธ ์ฉ๋์ ์ ํฉํ๊ฒ ๋์ํ๋ค.
- ๋ฌด๊ฑฐ์ด ํ๋ก๋์ ์๋ฒ์์๋ ์ค๋ ๋ ๊ฐ์๋ฅผ ๊ณ ์ ํ Executors.newFixedThreadPool์ ์ ํํ๊ฑฐ๋ ์์ ํ ํต์ ํ ์ ์๋ ThreadPoolExecutor๋ฅผ ์ง์ ์ฌ์ฉํ๋ ํธ์ด ํจ์ฌ ๋ซ๋ค.
์ฃผ์ํด์ ์ฌ์ฉํด์ผ ํ๋ค
์์ ํ๋ฅผ ์์ ๋ง๋๋ ์ผ์ ์ผ๊ฐ์ผ ํ๊ณ , ์ค๋ ๋๋ฅผ ์ง์ ๋ค๋ฃจ๋ ๊ฒ๋ ์ผ๋ฐ์ ์ผ๋ก ์ผ๊ฐ์ผ ํ๋ค. ์ค๋ ๋๋ฅผ ์ง์ ๋ค๋ฃจ๋ฉด Thread๊ฐ ์์ ๋จ์์ ์ํ ๋ฉ์ปค๋์ฆ ์ญํ ์ ๋ชจ๋ ์ํํ๊ฒ ๋๋ค. ๋ฐ๋ฉด ์คํ์ ํ๋ ์์ํฌ์์๋ ์์ ๋จ์์ ์คํ ๋งค์ปค๋์ฆ์ด ๋ถ๋ฆฌ๋์ด ์์ด์ ์๋ฏธ๊ฐ ๋ช ํํ๋ค.
- Runnable : ์ธ์๋ฅผ ๋ฐ์ง ์๊ณ ๋ฆฌํด๊ฐ์ด ์๋ค.
- Callable : ์ธ์๋ฅผ ๋ฐ์ง ์์ผ๋ฉฐ, ํน์ ํ์ ์ ๊ฐ์ฒด๋ฅผ ๋ฆฌํดํ๋ค. ๋ํ call() ๋ฉ์๋ ์ํ ์ค Exception์ ๋ฐ์ํ๋ค.
ForkJoinTask
์๋ฐ 7์ด ๋๋ฉด์ ์คํ์ ํ๋ ์์ํฌ๋ ํฌํฌ-์กฐ์ธ ํ์คํฌ๋ฅผ ์ง์ํ๋๋ก ํ์ฅ๋์๋ค. ํฌํฌ-์กฐ์ธ ํ์คํฌ, ์ฆ ForkJoinTask์ ์ธ์คํด์ค๋ ์์ ํ์ ํ์คํฌ๋ก ๋๋ ์ ์ด๊ณ , ForkJoinPool์ ๊ตฌ์ฑํ๋ ์ค๋ ๋๋ค์ด ์ด ํ์คํฌ๋ค์ ์ฒ๋ฆฌํ๋ฉฐ, ์ผ์ ๋จผ์ ๋๋ธ ์ค๋ ๋๋ ๋ค๋ฅธ ์ค๋ ๋์ ๋จ์ ํ์คํฌ๋ฅผ ๊ฐ์ ธ์ ๋์ ์ฒ๋ฆฌํ ์๋ ์๋ค.
์ด๋ฌํ ํฌํฌ-์กฐ์ธ ํ์คํฌ๋ฅผ ์ง์ ์์ฑํ๊ณ ํ๋ํ๊ธฐ๋ ์ด๋ ค์ด ์ผ์ด์ง๋ง, ํฌํฌ-์กฐ์ธ ํ์ ์ด์ฉํด ๋ง๋ ๋ณ๋ ฌ ์คํธ๋ฆผ์ ์ด์ฉํ๋ฉด ์ ์ ๋ ธ๋ ฅ์ผ๋ก ๊ทธ ์ด์ ์ ์ป์ ์ ์๋ค. ๋ฌผ๋ก ํฌํฌ-์กฐ์ธ์ ์ ํฉํ ํํ์ ์์ ์ด์ด์ผ ํ๋ค.