๐Ÿ”„ Java ThreadPool ๊ตฌ์กฐ ์ •๋ฆฌ

๊น€์ •๊ทœยท2025๋…„ 6์›” 19์ผ

โœ… 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๋ฅผ ์„ค์ •ํ•ด ์ž์› ์ œ์–ด์™€ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ ์ „๋žต์„ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค.โ€

profile
๊ธฐํš๊ณผ ์„ค๊ณ„ ๊ทธ๋ฆฌ๊ณ  ๊ตฌํ˜„๊นŒ์ง€ ํ•˜๋Š” ๊ฐœ๋ฐœ์ž๊ฐ€ ๋˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค

0๊ฐœ์˜ ๋Œ“๊ธ€