โ
ThreadPool์ด๋?
์๋ฐ์์ ๋ค์์ ์์ฒญ์ ์ฒ๋ฆฌํ๊ธฐ ์ํด ๋ฏธ๋ฆฌ ์์ฑ๋ ์ฐ๋ ๋ ์งํฉ(Pool)์ ์ฌ์ฌ์ฉํ๋ ๊ตฌ์กฐ
- ๋งค๋ฒ ์ ์ฐ๋ ๋๋ฅผ ๋ง๋ค์ง ์๊ณ , ์ผ์ ๊ฐ์์ ์ฐ๋ ๋๋ฅผ ๋ฐ๋ณต ์ฌ์ฉํ์ฌ ์ฑ๋ฅ์ ์ต์ ํ
- ์ฃผ๋ก ๋น๋๊ธฐ ์์
, ๋ฐฑ๊ทธ๋ผ์ด๋ ์์
, ๋๊ท๋ชจ ์์ฒญ ์ฒ๋ฆฌ ๋ฑ์ ์ฌ์ฉ๋จ
๐ง ์ ํ์ํ๊ฐ?
| ๋ฌธ์ | ThreadPool์ ํด๊ฒฐ ๋ฐฉ์ |
|---|
| ๋งค๋ฒ new Thread() ์์ฑ โ ์ฑ๋ฅ ์ ํ | ์ฐ๋ ๋๋ฅผ ์ฌ์ฌ์ฉํด์ ์์ ๋ญ๋น ๋ฐฉ์ง |
| ์ฐ๋ ๋ ๋๋ฌด ๋ง์ โ OOM ๊ฐ๋ฅ์ฑ | ์ฐ๋ ๋ ๊ฐ์ ์ ํ ๊ฐ๋ฅ (์ต๋ ์ค๋ ๋ ์ ์ค์ ) |
| ์์
ํ ๋ฏธ์ง์ | ์์
ํ(BlockingQueue)๋ฅผ ํตํด ์์
์ ์์ฐจ ์ฒ๋ฆฌ |
โ ํต์ฌ ๊ตฌ์ฑ ์์
| ๊ตฌ์ฑ์์ | ์ค๋ช
|
|---|
| Core Pool Size | ๊ธฐ๋ณธ ์ ์ง๋๋ ์ค๋ ๋ ์ |
| Maximum Pool Size | ์ต๋ ์ค๋ ๋ ์ (ํ๊ฐ ๊ฝ ์ฐผ์ ๋๊น์ง ํ์ฅ) |
| Queue (์์
ํ) | ์คํ ์ ๋๊ธฐ ์ค์ธ ์์
๋ณด๊ด (BlockingQueue) |
| RejectedExecutionHandler | ํ/์ค๋ ๋ ๋ชจ๋ ๊ฝ ์ฐผ์ ๋ ์ฒ๋ฆฌ ๋ฐฉ์ (์์ธ, ๋ฌด์ ๋ฑ) |
๐ง ์ฌ์ฉ ์์ ์ฝ๋
ExecutorService executor = Executors.newFixedThreadPool(5);
for (int i = 0; i < 10; i++) {
executor.submit(() -> {
System.out.println(Thread.currentThread().getName() + " ์์
์ฒ๋ฆฌ ์ค");
});
}
executor.shutdown();
โ๏ธ Executors ํฉํ ๋ฆฌ ๋ฉ์๋ ์ข
๋ฅ
| ๋ฉ์๋ | ์ค๋ช
|
|---|
| newFixedThreadPool(n) | ๊ณ ์ ๋ ๊ฐ์์ ์ฐ๋ ๋ ์ ์ง |
| newCachedThreadPool() | ์์ฒญ๋ง๋ค ์๋ก์ด ์ค๋ ๋ โ ์ฌ์ฌ์ฉํจ (๋ฌดํ ํ์ฅ ์ํ) |
| newSingleThreadExecutor() | ์ฐ๋ ๋ 1๊ฐ๋ก ๋ชจ๋ ์์
์์ฐจ ์ฒ๋ฆฌ |
| newScheduledThreadPool(n) | ์ฃผ๊ธฐ์ ์์
์์ฝ (์ค์ผ์ค๋ง) |
๐ ์ค๋ฌด์์ ์ฃผ์ํ ์
Executors๋ ๋ด๋ถ์ ์ผ๋ก ThreadPoolExecutor๋ฅผ ๊ฐ์ธ๊ณ ์์ด ์ธ๋ฐํ ์ ์ด๊ฐ ์ด๋ ค์
- ์ค๋ฌด์์๋ ์ง์
ThreadPoolExecutor๋ฅผ ์์ฑํด ํ ์ข
๋ฅ, ์ ์ฑ
, ์์ธ ์ฒ๋ฆฌ ์ ๋ต ๋ฑ์ ๋ช
์์ ์ผ๋ก ์ค์ ํจ
๐ง ๋ฉด์ ์ฉ ์ ๋ฆฌ ๋ฉํธ
โThreadPool์ ์๋ฐ์์ ๋ค์์ ์์
์ ํจ์จ์ ์ผ๋ก ์ฒ๋ฆฌํ๊ธฐ ์ํ ๊ตฌ์กฐ๋ก, ๋ฏธ๋ฆฌ ์์ฑ๋ ์ฐ๋ ๋๋ฅผ ์ฌ์ฌ์ฉํ์ฌ ์ฑ๋ฅ์ ์ต์ ํํฉ๋๋ค.
์ฃผ๋ก ExecutorService์ BlockingQueue๋ฅผ ํ์ฉํ๊ณ , ์ค๋ฌด์์๋ ์ง์ ThreadPoolExecutor๋ฅผ ์ค์ ํด ์์ ์ ์ด์ ์์ธ ์ฒ๋ฆฌ ์ ๋ต์ ๊ตฌ์ฑํฉ๋๋ค.โ