1 ์ค๋ ๋์ ExecutorService๊ฐ ํ์ํ ์ด์ ๋ ๋ฌด์์ ๋๊น?
Executors.newSingleThreadExecutor ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ๋จ์ผ ์ค๋ ๋๋ฅผ ํฌํจํ๋ ํ์ด ์๋ ExecutorService๋ฅผ ๋ง๋ค ์ ์์ต๋๋ค. ํ์ ๋ ผ๋ฆฌ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- ์๋น์ค๋ ํ ๋ฒ์ ํ๋์ ์์ ๋ง ์คํํฉ๋๋ค.
- ์คํ์ ์ํด N๊ฐ์ ์์ ์ ์ ์ถํ๋ฉด ๋ชจ๋ N๊ฐ์ ์์ ์ด ๋จ์ผ ์ค๋ ๋์ ์ํด ์ฐจ๋ก๋ก ์คํ๋ฉ๋๋ค.
- ์ค๋ ๋๊ฐ ์ค๋จ๋๋ฉด ๋๋จธ์ง ์์ ์ ์คํํ๊ธฐ ์ํด ์ ์ค๋ ๋๊ฐ ์์ฑ๋ฉ๋๋ค.
ํ๋ก๊ทธ๋จ์ ๋ค์ ๊ธฐ๋ฅ์ด ํ์ํ ์ํฉ์ ์์ํด ๋ด ์๋ค.
30์ด ์ด๋ด์ ์ฌ์ฉ์ ์์ฒญ์ ์ฒ๋ฆฌํด์ผ ํ์ง๋ง ๋จ์ ์๊ฐ๋น ํ๋์ ์์ฒญ๋ง ์ฒ๋ฆฌํด์ผ ํฉ๋๋ค.
์ฌ์ฉ์ ์์ฒญ์ ์ฒ๋ฆฌํ๊ธฐ ์ํ ์์ ํด๋์ค๋ฅผ ๋ง๋ญ๋๋ค.
class Task implements Runnable {
private final int taskNumber;
public Task(int taskNumber) {
this.taskNumber = taskNumber;
}
@Override
public void run() {
try {
Thread.sleep(1000);
} catch (InterruptedException ignored) {
}
System.out.printf("Processed request #%d on thread id=%d\\n", taskNumber, Thread.currentThread().getId());
}
}
์ด ํด๋์ค๋ ๋ค์ด์ค๋ ์์ฒญ์ ์ฒ๋ฆฌํ๋ ๋์์ ๋ชจ๋ธ๋งํ๊ณ ํด๋น ๋ฒํธ๋ฅผ ํ์ํฉ๋๋ค.
๋ค์์ผ๋ก, ๊ธฐ๋ณธ ๋ฉ์๋์์ ๋ค์ด์ค๋ ์์ฒญ์ ์์ฐจ์ ์ผ๋ก ์ฒ๋ฆฌํ๋ ๋ฐ ์ฌ์ฉํ ์ค๋ ๋ 1๊ฐ์ ๋ํ ExecutorService๋ฅผ ๋ง๋ญ๋๋ค . ์์ ์กฐ๊ฑด์ด "30์ด ์ด๋ด"๋ก ๊ท์ ๋์ด ์์ผ๋ฏ๋ก 30์ด ๋๊ธฐ ์๊ฐ์ ์ถ๊ฐํ ๋ค์ ExecutorService๋ฅผ ๊ฐ์ ๋ก ์ค์ง ํฉ๋๋ค .
public static void main(String[] args) throws InterruptedException {
ExecutorService executorService = Executors.newSingleThreadExecutor();
for (int i = 0; i < 1_000; i++) {
executorService.execute(new Task(i));
}
executorService.awaitTermination(30, TimeUnit.SECONDS);
executorService.shutdownNow();
}
ํ๋ก๊ทธ๋จ์ ์์ํ๋ฉด ์ฝ์์ ์์ฒญ ์ฒ๋ฆฌ์ ๋ํ ๋ฉ์์ง๊ฐ ํ์๋ฉ๋๋ค.
์ค๋ ๋ id=16์์ ์ฒ๋ฆฌ๋ ์์ฒญ #1 ์ค๋ ๋
id=16์์ ์ฒ๋ฆฌ๋ ์์ฒญ #2
โฆ
์ค๋ ๋ id=16์์ ์ฒ๋ฆฌ๋ ์์ฒญ #29
30์ด ๋์ ์์ฒญ์ ์ฒ๋ฆฌํ ํ executorService๋ ํ์ฌ ์์ (์คํ ์ค์ธ ์์ )์ ์ค์งํ๊ณ ๋ณด๋ฅ ์ค์ธ ๋ชจ๋ ์์ ์ ์ทจ์ํ๋ shutdownNow() ๋ฉ์๋๋ฅผ ํธ์ถํฉ๋๋ค . ๊ทธ ํ ํ๋ก๊ทธ๋จ์ด ์ฑ๊ณต์ ์ผ๋ก ์ข ๋ฃ๋ฉ๋๋ค.
๊ทธ๋ฌ๋ ๋ชจ๋ ๊ฒ์ด ํญ์ ์๋ฒฝํ ๊ฒ์ ์๋๋๋ค. ์ฐ๋ฆฌ ํ๋ก๊ทธ๋จ์ ํ์ ์ ์ผํ ์ค๋ ๋๊ฐ ์ ํํ ์์ ์ค ํ๋๊ฐ ์๋ชป ์๋ํ๊ณ ์ฌ์ง์ด ์ค๋ ๋๋ฅผ ์ข ๋ฃํ๋ ์ํฉ์ ์ฝ๊ฒ ๊ฐ์ง ์ ์๊ธฐ ๋๋ฌธ์ ๋๋ค. ์ด ์ํฉ์ ์๋ฎฌ๋ ์ดํธํ์ฌ ์ด ๊ฒฝ์ฐ executorService๊ฐ ๋จ์ผ ์ค๋ ๋๋ก ์๋ํ๋ ๋ฐฉ์์ ํ์ ํ ์ ์์ต๋๋ค .
์ด๋ฅผ ์ํด ์์ ์ค ํ๋๊ฐ ์คํ๋๋ ๋์ ์์ ํ์ง ์๊ณ ์ฌ์ฉ๋์ง ์๋ Thread.currentThread().stop() ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ์ค๋ ๋๋ฅผ ์ข ๋ฃํฉ๋๋ค. ์์ ์ค ํ๋๊ฐ ์ค๋ ๋๋ฅผ ์ข ๋ฃํ๋ ์ํฉ์ ์๋ฎฌ๋ ์ดํธํ๊ธฐ ์ํด ์๋์ ์ผ๋ก ์ด ์์ ์ ์ํํ๊ณ ์์ต๋๋ค.
Task ํด๋์ค ์์ run ๋ฉ์๋๋ฅผ ๋ณ๊ฒฝํฉ๋๋ค .
@Override
public void run() {
try {
Thread.sleep(1000);
} catch (InterruptedException ignored) {
}
if (taskNumber == 5) {
Thread.currentThread().stop();
}
System.out.printf("Processed request #%d on thread id=%d\\n", taskNumber, Thread.currentThread().getId());
}
์์ #5๋ฅผ ์ค๋จํ๊ฒ ์ต๋๋ค.
์์ #5์ ๋์์ ์ค๋ ๋๊ฐ ์ค๋จ๋ ์ถ๋ ฅ์ด ์ด๋ป๊ฒ ๋ณด์ด๋์ง ๋ด ์๋ค.
id=16์์ ์ฒ๋ฆฌ๋ ์์ฒญ #1 ์ค๋ ๋ id=16์์
์ฒ๋ฆฌ๋ ์์ฒญ #2 ์ค๋ ๋ id=16
์์ ์ฒ๋ฆฌ๋ ์์ฒญ #3 ์ค๋ ๋ id=16
์์ ์ฒ๋ฆฌ๋ ์์ฒญ #4 ์ค๋ ๋ id=16์์
์ฒ๋ฆฌ๋ ์์ฒญ #6 thread id=17
thread id=17์์ ์ฒ๋ฆฌ๋ ์์ฒญ #7
โฆ
thread id=17์์ ์ฒ๋ฆฌ๋ ์์ฒญ #29
์์ 5์ ๋์์ ์ค๋ ๋๊ฐ ์ค๋จ๋ ํ ์์ ์ ์ด์ ์ ์๋ณ์๊ฐ 16์ธ ์ค๋ ๋์์ ์คํ๋์์ง๋ง ์๋ณ์๊ฐ 17์ธ ์ค๋ ๋์์ ์คํ๋๊ธฐ ์์ํฉ๋๋ค. ๋จ์ผ ์ค๋ ๋, ์ด๊ฒ์ ๋จ์ง ํ ๊ฐ์ง๋ฅผ ์๋ฏธํ ์ ์์ต๋๋ค. executorService๋ ์ค์ง๋ ์ค๋ ๋๋ฅผ ์ ์ค๋ ๋๋ก ๊ต์ฒดํ๊ณ ์์ ์ ๊ณ์ ์คํํ์ต๋๋ค.
๋ฐ๋ผ์ ์์ ์ ํ ๋ฒ์ ํ๋์ฉ ์์ฐจ์ ์ผ๋ก ์ฒ๋ฆฌํ๊ณ ์ด์ ์์ ์ ์๋ฃ์ ๊ด๊ณ์์ด ๋๊ธฐ์ด์์ ์์ ์ ๊ณ์ ์ฒ๋ฆฌํ๋ ค๋ ๊ฒฝ์ฐ ๋จ์ผ ์ค๋ ๋ ํ๊ณผ ํจ๊ป newSingleThreadExecutor๋ฅผ ์ฌ์ฉํด์ผ ํฉ๋๋ค (์: ์ค๋ ๋๋ฅผ ์ฃฝ์ ๋๋ค).
์ค๋ ๋ํฉํ ๋ฆฌ
์ค๋ ๋ ์์ฑ ๋ฐ ์ฌ์์ฑ์ ๋ํด ๋งํ ๋ ์ธ๊ธํ์ง ์์ ์ ์์ต๋๋ค.์ค๋ ๋ํฉํ ๋ฆฌ.
ใ ์ค๋ ๋ํฉํ ๋ฆฌ์์ฒญ ์ ์ ์ค๋ ๋๋ฅผ ์์ฑํ๋ ๊ฐ์ฒด์ ๋๋ค.
์์ฒด ์ค๋ ๋ ์์ฑ ํฉํ ๋ฆฌ๋ฅผ ์์ฑํ๊ณ ์ธ์คํด์ค๋ฅผ Executors.newSingleThreadExecutor(ThreadFactory threadFactory) ๋ฉ์๋์ ์ ๋ฌํ ์ ์์ต๋๋ค.
|
์ ์ค๋ ๋๋ฅผ ์์ฑํ๋ ๋ฉ์๋๋ฅผ ์ฌ์ ์ํ๊ณ ์ค๋ ๋ ์ด๋ฆ์ ์์ฑ์์ ์ ๋ฌํฉ๋๋ค. |
|
์์ฑ๋ ์ค๋ ๋์ ์ด๋ฆ๊ณผ ์ฐ์ ์์๋ฅผ ๋ณ๊ฒฝํ์ต๋๋ค. |
๋ฐ๋ผ์ 2๊ฐ์ ์ค๋ฒ๋ก๋๋ Executors.newSingleThreadExecutor ๋ฉ์๋๊ฐ ์์์ ์ ์ ์์ต๋๋ค . ํ๋๋ ๋งค๊ฐ๋ณ์๊ฐ ์๊ณ ๋ค๋ฅธ ํ๋๋ ThreadFactory ๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
ThreadFactory ๋ฅผ ์ฌ์ฉํ๋ฉด ํ์์ ๋ฐ๋ผ ์์ฑ๋ ์ค๋ ๋๋ฅผ ๊ตฌ์ฑํ ์ ์์ต๋๋ค(์: ์ฐ์ ์์ ์ค์ , ์ค๋ ๋ ํ์ ํด๋์ค ์ฌ์ฉ, ์ค๋ ๋์ UncaughtExceptionHandler ์ถ๊ฐ ๋ฑ).