๐ฏ ์์ดํ 80. ์ค๋ ๋๋ณด๋ค๋ ์คํ์, ํ์คํฌ, ์คํธ๋ฆผ์ ์ ์ฉํ๋ผ.
java.util.concurrent
๋๋ฅ๋ฑ์ฅ
- ์คํ์ ํ๋ ์์ํฌ๋ผ๊ณ ํ๋ ์ธํฐํ์ด์ค ๊ธฐ๋ฐ์ ์ ์ฐํ ํ์คํฌ ์คํ ๊ธฐ๋ฅ์ ๋ด๊ณ ์์
ExecutorService exec = Executors.newSingleThreadExecutor();
exec.execute(runnable);
exec.shutdown();
๐ฏ ์์ดํ 81. wait์ notify๋ณด๋ค๋ ๋์์ฑ ์ ํธ๋ฆฌํฐ๋ฅผ ์ ์ฉํ๋ผ.
wait
์ notify
๋ ์ฌ๋ฐ๋ฅด๊ฒ ์ฌ์ฉํ๊ธฐ๊ฐ ์์ฃผ ๊น๋ค๋ก์ฐ๋ ๊ณ ์์ค ๋์์ฑ ์ ํธ๋ฆฌํฐ๋ฅผ ์ฌ์ฉํ์!
java.util.concurrent
์ ๊ณ ์์ค ์ ํธ๋ฆฌํฐ์ ์ธ ๋ฒ์ฃผ1๏ธโฃ ์คํ์ ํ๋ ์์ํฌ
2๏ธโฃ ๋์์ฑ ์ปฌ๋ ์
3๏ธโฃ ๋๊ธฐํ ์ฅ์น
1) ์คํ์ ํ๋ ์์ํฌ๋ ์์์ ๋งํ Executor
๋ก ์ธํฐํ์ด์ค ๊ธฐ๋ฐ์ ์ ์ฐํ ํ์คํธ ์คํ ๊ธฐ๋ฅ์ ๋ด๊ณ ์๋ค.
2) ๋์์ฑ ์ปฌ๋ ์
์ ์ปฌ๋ ์
์ ๋์์ฑ์ ๊ฐ๋ฏธํด ๊ตฌํํ ๊ณ ์ฑ๋ฅ ์ปฌ๋ ์
์ด๋ค.
๋์์ฑ ์ปฌ๋ ์
์์ ๋์์ฑ์ ๋ฌด๋ ฅํํ๋ ๊ฑด ๋ถ๊ฐ๋ฅํ๋ฉฐ, ์ธ๋ถ์์ ๋ฝ์ ์ถ๊ฐ๋ก ์ฌ์ฉํ๋ฉด ์คํ๋ ค ์๋๊ฐ ๋๋ ค์ง๋ค.
3) ๋๊ธฐํ ์ฅ์น๋ ์ค๋ ๋๊ฐ ๋ค๋ฅธ ์ค๋ ๋๋ฅผ ๊ธฐ๋ค๋ฆด ์ ์๊ฒ ํ๋ค.
์๋ฅผ๋ค์ด Queue๋ฅผ ํ์ฅํ BlockingQueue๋ ํ์ฅ๋ ๊ธฐ๋ฅ์ค take๋ผ๋ ๊ธฐ๋ฅ์ ๋ณผ ์ ์๋๋ฐ, ํ์ ์ฒซ ๋ฒ์งธ ์์๋ฅผ ๊บผ๋ด๋ ๊ธฐ๋ฅ์ผ๋ก ๋ง์ฝ ํ๊ฐ ๋น์๋ค๋ฉด ์๋ก์ด ์์๊ฐ ์ถ๊ฐ๋ ๋๊น์ง ๊ธฐ๋ค๋ฆฐ๋ค. ๊ทธ๋ ๊ธฐ์ BlockingQueue๋ ์์
ํ๋ก ์ฐ๊ธฐ ์ ๋นํ๊ณ ThreadPoolExecutor๋ ์คํ์ ์๋น์ค ๊ตฌํ์ฒด์์ BlockingQueue๋ฅผ ์ฌ์ฉํ๋ค. ๊ทธ ๋ฐ์ CountDownLatch
,Semaphore
,CyclicBarrier
,Exchanger
,Phaser
๋ฑ์ด ์๋ค.
์ฐธ๊ณ ์๋ฃ
Joshua Bloch, ใEffective Java 3/Eใ, ๊ฐ์๋งต์ ์ฎ๊น, ํ๋ก๊ทธ๋๋ฐ์ธ์ฌ์ดํธ(2018)
http://www.kyobobook.co.kr/product/detailViewKor.laf?ejkGb=KOR&mallGb=KOR&barcode=9788966262281&orderClick=LEa&Kc=