๐๏ธ Java์ ExecutorService ์ค๋ ๋ ํ ์ ๋ณตํ๊ธฐ
์ด๋ฒ ๊ธ์์๋ Executors๊ฐ ์ ๊ณตํ๋ ๋ํ์ ์ธ ์ค๋ ๋ ํ 4์ข ๋ฅ๋ฅผ ์ดํด๋ณด๊ณ , ๊ฐ๊ฐ์ ์ฌ์ฉ ์๋๋ฆฌ์ค์ ์ฃผ์ํ ์ ์ ์์ ์ค์ฌ์ผ๋ก ์ ๋ฆฌํด๋ณด๊ฒ ์ต๋๋ค. ย newFixedThreadPool(int nThreads) ์ด ๋ฉ์๋๋ ์ ํด์ง ๊ฐ์๋งํผ์ ์ค๋ ๋๋ฅผ ๋ฏธ๋ฆฌ ์์ฑํ๊ณ , ๊ทธ ์ค๋ ๋๋ค์ด ์ฌ์ฌ์ฉ๋๋ฉฐ ์์ ์ ์ฒ๋ฆฌํฉ๋๋ค. ๋ ๋ง์ ์์ ์ด ๋ค์ด์ค๋ฉด ๋ด๋ถ ํ์ ์์ด๊ณ , ๊ธฐ์กด ์ค๋ ๋๋ค์ด ์์ ์ ์ฒ๋ฆฌํ๋ฉด ์์ฐจ์ ์ผ๋ก ์๋น๋ฉ๋๋ค. ExecutorService executor = Executors.newFixedThreadPool(4);ย โ ์ฌ์ฉ ์์ * ์ฒ๋ฆฌํ ์์ ๋์ ๋ง์ง๋ง, ๋์์ ์ฒ๋ฆฌํด์ผ ํ๋ ์์ ์๋ฅผ ์ ํํ๊ณ ์ถ์ ๊ฒฝ์ฐ * CPU ์์์ ๊ณ ๋ฅด๊ฒ ์ฌ์ฉํ๋ฉฐ, ์์ ์ ์ธ ์ฒ๋ฆฌ๋์ ์ํ๋ ๊ฒฝ์ฐ ๐งช ์์ for (int i = 0; i { System.out.println("Task " + taskId + " executed by " + Thread.currentThread().getName()); Thread.sleep(1000); // ๋ชจ์ ์์ }); } โ ๏ธ ์ฃผ์ * ๊ณผ๋ํ๊ฒ ํฐ ์์ ํ๊ฐ ์์ผ ์ ์์ โ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋ ์ฆ๊ฐ * ์ค๋ ๋ ์๋ CPU ์ฝ์ด ์๋ ์ ํ๋ฆฌ์ผ์ด์ ํน์ฑ์ ๋ง๊ฒ ์ค์ ํด์ผ ํจ ย newCachedThreadPool() ์ด ์ค๋ ๋ ํ์ ์์ฒญ์ด ๋ง์ผ๋ฉด ์๋ก์ด ์ค๋ ๋๋ฅผ ๊ณ์ ์์ฑํ๊ณ , ํน์ ๊ธฐ๊ฐย ๋์ ์ฌ์ฉ๋์ง ์์ผ๋ฉด ์ ๊ฑฐํฉ๋๋ค. ์บ์๋ ์ค๋ ๋๋ฅผ ์ฌ์ฌ์ฉํ๋ฏ๋ก ๋น ๋ฅด๊ณ ์ ์ฐํฉ๋๋ค. ExecutorService executor = Executors.newCachedThreadPool(); โ ์ฌ์ฉ ์์ * ์์ ์ด ์งง๊ณ ๋น ๋ฅด๊ฒ ๋๋๋ I/O ์ค์ฌ์ ์์ ์ผ ๋ * ์งง์ burst๊ฐ ์์ฃผ ๋ฐ์ํ๋ ์ํฉ์์ ์ ์ฉ ๐งช ์์ for (int i = 0; i { System.out.println("Task " + taskId + " executed by " + Thread.currentThread().getName()); }); }ย โ ๏ธ ์ฃผ์ * ์์ฒญ์ด ๋ง์ ๊ฒฝ์ฐ ์ค๋ ๋๊ฐ ๋ฌด์ ํ์ผ๋ก ๋์ด๋ ๊ณผ๋ถํ๊ฐ ๋ ์ ์์ โ ์ค์ ์ด์์์๋ ThreadPoolExecutor๋ก ์ปค์คํ ์ ์ด ํ์ ย newSingleThreadExecutor() ํญ์ ๋จ ํ๋์ ์ค๋ ๋๋ง ์ฌ์ฉํ์ฌ ์์ ์ ์ฒ๋ฆฌํฉ๋๋ค. ์์ ์ FIFO ์์๋ก ์คํ๋๋ฉฐ, ์์๊ฐ ์ค์ํ ๋ก์ง์ ์ ํฉํฉ๋๋ค. ExecutorService executor = Executors.newSingleThreadExecutor(); โ ์ฌ์ฉ ์์ * ์์ ์์๊ฐ ์ค์ํ ๋ * ํ๋์ ๋ฆฌ์์ค(DB, ํ์ผ ๋ฑ)์ ๋ํด ์ง๋ ฌํ๋ ์ ๊ทผ์ด ํ์ํ ๋ ๐งช ์์ for (int i = 0; i { System.out.println("Processing task " + taskId); Thread.sleep(500); }); }ย โ ๏ธ ์ฃผ์ * ํ๋์ ์ค๋ ๋์ ์์กดํ๊ธฐ ๋๋ฌธ์ ์ฒ๋ฆฌ๋์ ๋ฎ์ * ์ค๋ ๋๊ฐ ์ฃฝ์ผ๋ฉด ์๋ก์ด ์ค๋ ๋๋ก ๋์ฒด๋๋ฏ๋ก ์ค๋จ๋์ง๋ ์์ ย newScheduledThreadPoool(int corePoolSize) ์ง์ฐ ์คํ(delay)์ด๋ ์ฃผ๊ธฐ์ ์ธ ์์ (interval) ์คํ์ ํนํ๋ ์ค๋ ๋ ํ์ ๋๋ค. ScheduledExecutorService๋ฅผ ๋ฐํํ๋ฉฐ, Java์ ํ์ด๋จธ ์ญํ ๋ ์ํํ ์ ์์ต๋๋ค. ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(2); โ ์ฌ์ฉ ์์ * ์ฃผ๊ธฐ์ ์ธ ๋ฐฑ์ ์์ , ๋ชจ๋ํฐ๋ง, ์๋ฆผ ์ ์ก ๋ฑ * ํน์ ์๊ฐ ํ ์์ ์ ์คํํ๊ณ ์ถ์ ๋ ๐งช ์์ scheduler.scheduleAtFixedRate(() -> { System.out.println("Heartbeat sent by " + Thread.currentThread().getName()); }, 1, 5, TimeUnit.SECONDS); // 1์ด ํ ์์, 5์ด๋ง๋ค ๋ฐ๋ณต โ ๏ธ ์ฃผ์ * ์์ ์ด ๋๋ฌด ์ค๋ ๊ฑธ๋ฆฌ๋ฉด ๋ค์ ์ฃผ๊ธฐ ์์ ์ด ์ง์ฐ๋ ์ ์์ โ ์ฒ๋ฆฌ ์๊ฐ์ด ์ผ์ ํ์ง ์๋ค๋ฉด scheduleWithFixedDelay()๋ฅผ ๊ณ ๋ ค ย ย ๐ง ๋ง๋ฌด๋ฆฌ Java์์ Executors ํฉํ ๋ฆฌ ๋ฉ์๋๋ ๋ค์ํ ํํ์ ์ค๋ ๋ ํ์ ๊ฐ๋จํ ์์ฑํ ์ ์๊ฒ ๋์์ค๋๋ค. ํ์ง๋ง, ์ด์ ํ๊ฒฝ์์๋ ThreadPoolExecutor๋ฅผ ์ง์ ์์ฑํ์ฌ ์์ ํ, ์ต๋ ์ค๋ ๋ ์, ๊ฑฐ๋ถ ์ ์ฑ ๋ฑ์ ์ธ๋ฐํ๊ฒ ์กฐ์ ํ๋ ๊ฒ์ด ๋์ฑ ์์ ํ๊ณ ํ์ฅ์ฑ ์๋ ์ ํ์ ๋๋ค.