Executors ํด๋ž˜์Šค ์˜ newFixedThreadPool ๋ฉ”์„œ๋“œ ๋Š” ๊ณ ์ •๋œ ์ˆ˜์˜ ์Šค๋ ˆ๋“œ๋กœ executorService๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค . newSingleThreadExecutor ๋ฉ”์„œ๋“œ ์™€ ๋‹ฌ๋ฆฌ ํ’€์—์„œ ์›ํ•˜๋Š” ์Šค๋ ˆ๋“œ ์ˆ˜๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ๋‚ด๋ถ€์ ์œผ๋กœ๋Š” ๋‹ค์Œ ์ฝ”๋“œ๊ฐ€ ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค.


new ThreadPoolExecutor(nThreads, nThreads,
                                      	0L, TimeUnit.MILLISECONDS,
                                      	new LinkedBlockingQueue());

corePoolSize ( ์‹คํ–‰๊ธฐ ์„œ๋น„์Šค๊ฐ€ ์‹œ์ž‘๋  ๋•Œ ์ค€๋น„(์‹œ์ž‘)๋  ์Šค๋ ˆ๋“œ ์ˆ˜ ) ๋ฐ maximumPoolSize ( ์‹คํ–‰๊ธฐ ์„œ๋น„์Šค๊ฐ€ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋Š” ์ตœ๋Œ€ ์Šค๋ ˆ๋“œ ์ˆ˜ ) ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” ๋™์ผํ•œ ๊ฐ’์„ ๋ฐ›์Šต๋‹ˆ๋‹ค. newFixedThreadPool (nThreads ) . ๊ทธ๋ฆฌ๊ณ  ์ •ํ™•ํžˆ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ์šฐ๋ฆฌ ์ž์‹ ์˜ ThreadFactory ๊ตฌํ˜„์„ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ž, ExecutorService ๊ฐ€ ํ•„์š”ํ•œ ์ด์œ ๋ฅผ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค .

๊ณ ์ •๋œ ์ˆ˜(n)์˜ ์Šค๋ ˆ๋“œ๊ฐ€ ์žˆ๋Š” ExecutorService ์˜ ๋…ผ๋ฆฌ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค .

  • ์ž‘์—… ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•ด ์ตœ๋Œ€ n๊ฐœ์˜ ์Šค๋ ˆ๋“œ๊ฐ€ ํ™œ์„ฑํ™”๋ฉ๋‹ˆ๋‹ค.
  • n๊ฐœ ์ด์ƒ์˜ ์ž‘์—…์ด ์ œ์ถœ๋˜๋ฉด ์Šค๋ ˆ๋“œ๊ฐ€ ํ•ด์ œ๋  ๋•Œ๊นŒ์ง€ ๋Œ€๊ธฐ์—ด์— ๋ณด๊ด€๋ฉ๋‹ˆ๋‹ค.
  • ์Šค๋ ˆ๋“œ ์ค‘ ํ•˜๋‚˜๊ฐ€ ์‹คํŒจํ•˜๊ณ  ์ข…๋ฃŒ๋˜๋ฉด ๊ทธ ์ž๋ฆฌ๋ฅผ ๋Œ€์‹ ํ•  ์ƒˆ ์Šค๋ ˆ๋“œ๊ฐ€ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.
  • ํ’€์˜ ๋ชจ๋“  ์Šค๋ ˆ๋“œ๋Š” ํ’€์ด ์ข…๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ํ™œ์„ฑ ์ƒํƒœ์ž…๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด ๊ณตํ•ญ์—์„œ ๋ณด์•ˆ ๊ฒ€์ƒ‰๋Œ€๋ฅผ ํ†ต๊ณผํ•˜๊ธฐ ์œ„ํ•ด ๊ธฐ๋‹ค๋ฆฌ๋Š” ๊ฒƒ์„ ์ƒ์ƒํ•ด ๋ณด์‹ญ์‹œ์˜ค. ๋ณด์•ˆ ๊ฒ€์ƒ‰ ์ง์ „๊นŒ์ง€ ๋ชจ๋“  ์‚ฌ๋žŒ์ด ํ•œ ์ค„์— ์„œ ์žˆ์œผ๋ฉฐ ์Šน๊ฐ์€ ๋ชจ๋“  ์ž‘์—… ๊ฒ€๋ฌธ์†Œ์— ๋ถ„์‚ฐ๋ฉ๋‹ˆ๋‹ค. ์ฒดํฌํฌ์ธํŠธ ์ค‘ ํ•˜๋‚˜์—์„œ ์ง€์—ฐ์ด ๋ฐœ์ƒํ•˜๋ฉด ์ฒซ ๋ฒˆ์งธ ์ฒดํฌํฌ์ธํŠธ๊ฐ€ ๋น„์›Œ์งˆ ๋•Œ๊นŒ์ง€ ๋‘ ๋ฒˆ์งธ ์ฒดํฌํฌ์ธํŠธ๋งŒ ๋Œ€๊ธฐ์—ด์„ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ํ•˜๋‚˜์˜ ๊ฒ€๋ฌธ์†Œ๊ฐ€ ์™„์ „ํžˆ ๋‹ซํžˆ๋ฉด ๋‹ค๋ฅธ ๊ฒ€๋ฌธ์†Œ๊ฐ€ ์—ด๋ฆฌ๋ฉด์„œ ์ด๋ฅผ ๋Œ€์ฒดํ•˜๊ณ  ์Šน๊ฐ์€ ๋‘ ๊ฒ€๋ฌธ์†Œ๋ฅผ ํ†ตํ•ด ๊ณ„์† ์ฒ˜๋ฆฌ๋ฉ๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” ์กฐ๊ฑด์ด ์ด์ƒ์ ์ด๋ผ ํ• ์ง€๋ผ๋„ โ€” ์•ฝ์†๋œ n๊ฐœ์˜ ์Šค๋ ˆ๋“œ๊ฐ€ ์•ˆ์ •์ ์œผ๋กœ ์ž‘๋™ํ•˜๊ณ , ์˜ค๋ฅ˜๋กœ ๋๋‚˜๋Š” ์Šค๋ ˆ๋“œ๋Š” ํ•ญ์ƒ ๊ต์ฒด๋จ(์ œํ•œ๋œ ๋ฆฌ์†Œ์Šค๋กœ ์ธํ•ด ์‹ค์ œ ๊ณตํ•ญ์—์„œ๋Š” ๋‹ฌ์„ฑํ•  ์ˆ˜ ์—†์Œ) โ€” ์‹œ์Šคํ…œ์— ์—ฌ์ „ํžˆ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์Šค๋ ˆ๋“œ๊ฐ€ ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ๋ณด๋‹ค ๋Œ€๊ธฐ์—ด์ด ๋” ๋นจ๋ฆฌ ์ฆ๊ฐ€ํ•˜๋”๋ผ๋„ ์–ด๋–ค ์ƒํ™ฉ์—์„œ๋„ ๋” ๋งŽ์€ ์Šค๋ ˆ๋“œ๊ฐ€ ์žˆ์„ ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

ExecutorService๊ฐ€ ๊ณ ์ •๋œ ์ˆ˜์˜ ์Šค๋ ˆ๋“œ์—์„œ ์ž‘๋™ํ•˜๋Š” ๋ฐฉ์‹์„ ์‹ค์งˆ์ ์œผ๋กœ ์ดํ•ดํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค . Runnable์„ ๊ตฌํ˜„ํ•˜๋Š” ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค์–ด ๋ด…์‹œ๋‹ค . ์ด ํด๋ž˜์Šค์˜ ๊ฐœ์ฒด๋Š” ExecutorService ์— ๋Œ€ํ•œ ์ž‘์—…์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค .


public class Task implements Runnable {
    int taskNumber;
 
    public Task(int taskNumber) {
        this.taskNumber = taskNumber;
    }
 
    @Override
    public void run() {
try {
            TimeUnit.SECONDS.sleep(2);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("Processed user request #" + taskNumber + " on thread " + Thread.currentThread().getName());
    }
}
    

run() ๋ฉ”์„œ๋“œ ์—์„œ ์šฐ๋ฆฌ๋Š” 2์ดˆ ๋™์•ˆ ์Šค๋ ˆ๋“œ๋ฅผ ์ฐจ๋‹จํ•˜๊ณ  ์ผ๋ถ€ ์›Œํฌ๋กœ๋“œ๋ฅผ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ํ•œ ๋‹ค์Œ ํ˜„์žฌ ์ž‘์—…์˜ ๋ฒˆํ˜ธ์™€ ์ž‘์—…์„ ์‹คํ–‰ํ•˜๋Š” ์Šค๋ ˆ๋“œ์˜ ์ด๋ฆ„์„ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.


ExecutorService executorService = Executors.newFixedThreadPool(3);
 
        for (int i = 0; i < 30; i++) {
            executorService.execute(new Task(i));
        }
        
        executorService.shutdown();
    

๋จผ์ € ๊ธฐ๋ณธ ๋ฉ”์„œ๋“œ์—์„œ ExecutorService๋ฅผ ๋งŒ๋“ค๊ณ  ์‹คํ–‰์„ ์œ„ํ•ด 30๊ฐœ์˜ ์ž‘์—…์„ ์ œ์ถœํ•ฉ๋‹ˆ๋‹ค.

pool-1-thread-2 ์Šค๋ ˆ๋“œ์—์„œ ์ฒ˜๋ฆฌ๋œ ์‚ฌ์šฉ์ž ์š”์ฒญ #1
pool-1-thread-1 ์Šค๋ ˆ๋“œ์—์„œ ์ฒ˜๋ฆฌ
๋œ ์‚ฌ์šฉ์ž ์š”์ฒญ #0 pool-1-thread-3 ์Šค๋ ˆ๋“œ์—์„œ ์ฒ˜๋ฆฌ๋œ ์‚ฌ์šฉ์ž ์š”์ฒญ #2
pool-์—์„œ ์ฒ˜๋ฆฌ๋œ ์‚ฌ์šฉ์ž ์š”์ฒญ #5 1-thread-3 ์Šค๋ ˆ๋“œ
pool-1-thread-2 ์Šค๋ ˆ๋“œ์—์„œ ์ฒ˜๋ฆฌ๋œ ์‚ฌ์šฉ์ž ์š”์ฒญ #3
pool-1-thread-1 ์Šค๋ ˆ๋“œ์—์„œ ์ฒ˜๋ฆฌ๋œ ์‚ฌ์šฉ์ž ์š”์ฒญ #4 pool-1
-thread-1 ์Šค๋ ˆ๋“œ์—์„œ ์ฒ˜๋ฆฌ๋œ ์‚ฌ์šฉ์ž ์š”์ฒญ #8
์ฒ˜๋ฆฌ๋œ ์‚ฌ์šฉ์ž pool-1-thread-3 ์Šค๋ ˆ๋“œ์—์„œ ์š”์ฒญ #6 pool
-1-thread-2 ์Šค๋ ˆ๋“œ์—์„œ ์ฒ˜๋ฆฌ๋œ ์‚ฌ์šฉ์ž ์š”์ฒญ #7 pool-1-thread
-3 ์Šค๋ ˆ๋“œ์—์„œ ์ฒ˜๋ฆฌ๋œ ์‚ฌ์šฉ์ž ์š”์ฒญ #10
pool-1-์—์„œ ์ฒ˜๋ฆฌ๋œ ์‚ฌ์šฉ์ž ์š”์ฒญ #9 thread-1 ์Šค๋ ˆ๋“œ
pool-1-thread-2 ์Šค๋ ˆ๋“œ์—์„œ ์ฒ˜๋ฆฌ๋œ ์‚ฌ์šฉ์ž ์š”์ฒญ #11
pool-1-thread-3 ์Šค๋ ˆ๋“œ์—์„œ ์ฒ˜๋ฆฌ๋œ ์‚ฌ์šฉ์ž ์š”์ฒญ #12
pool-1-thread-2 ์Šค๋ ˆ๋“œ์—์„œ ์ฒ˜๋ฆฌ๋œ ์‚ฌ์šฉ์ž ์š”์ฒญ #14
pool-1-thread-1 ์Šค๋ ˆ๋“œ์—์„œ ์ฒ˜๋ฆฌ๋œ ์‚ฌ์šฉ์ž ์š”์ฒญ #13 pool
-1-thread-3 ์Šค๋ ˆ๋“œ์—์„œ ์ฒ˜๋ฆฌ๋œ ์‚ฌ์šฉ์ž ์š”์ฒญ #15
pool-์—์„œ ์ฒ˜๋ฆฌ๋œ ์‚ฌ์šฉ์ž ์š”์ฒญ #16 1-thread-2 ์Šค๋ ˆ๋“œ
pool-1-thread-1 ์Šค๋ ˆ๋“œ์—์„œ ์ฒ˜๋ฆฌ๋œ ์‚ฌ์šฉ์ž ์š”์ฒญ #17
pool-1-thread-3 ์Šค๋ ˆ๋“œ์—์„œ ์ฒ˜๋ฆฌ๋œ ์‚ฌ์šฉ์ž ์š”์ฒญ #18
pool-1-thread-2 ์Šค๋ ˆ๋“œ์—์„œ ์ฒ˜๋ฆฌ๋œ ์‚ฌ์šฉ์ž ์š”์ฒญ #19
์ฒ˜๋ฆฌ๋œ ์‚ฌ์šฉ์ž pool-1-thread-1 ์Šค๋ ˆ๋“œ์—์„œ
์š”์ฒญ #20 pool-1-thread-3 ์Šค๋ ˆ๋“œ์—์„œ ์ฒ˜๋ฆฌ๋œ ์‚ฌ์šฉ์ž ์š”์ฒญ #21 pool-
1-thread-2 ์Šค๋ ˆ๋“œ์—์„œ ์ฒ˜๋ฆฌ๋œ ์‚ฌ์šฉ์ž ์š”์ฒญ #22 pool-1-
์—์„œ ์ฒ˜๋ฆฌ๋œ ์‚ฌ์šฉ์ž ์š”์ฒญ #23 thread-1 ์Šค๋ ˆ๋“œ
pool-1-thread-2 ์Šค๋ ˆ๋“œ์—์„œ ์ฒ˜๋ฆฌ๋œ ์‚ฌ์šฉ์ž ์š”์ฒญ #25
pool-1-thread-3 ์Šค๋ ˆ๋“œ์—์„œ ์ฒ˜๋ฆฌ๋œ ์‚ฌ์šฉ์ž ์š”์ฒญ #24
pool-1-thread-1 ์Šค๋ ˆ๋“œ์—์„œ ์ฒ˜๋ฆฌ๋œ ์‚ฌ์šฉ์ž ์š”์ฒญ #26
pool-1-thread-2 ์Šค๋ ˆ๋“œ์—์„œ ์ฒ˜๋ฆฌ๋œ ์‚ฌ์šฉ์ž ์š”์ฒญ #27 pool-
1-thread-3 ์Šค๋ ˆ๋“œ์—์„œ ์ฒ˜๋ฆฌ๋œ ์‚ฌ์šฉ์ž ์š”์ฒญ #28 pool-1-thread-3 ์Šค๋ ˆ๋“œ์—์„œ
์ฒ˜๋ฆฌ๋œ ์‚ฌ์šฉ์ž ์š”์ฒญ #29 1-์Šค๋ ˆ๋“œ-1 ์Šค๋ ˆ๋“œ

์ฝ˜์†” ์ถœ๋ ฅ์€ ์ž‘์—…์ด ์ด์ „ ์ž‘์—…์— ์˜ํ•ด ํ•ด์ œ๋œ ํ›„ ๋‹ค๋ฅธ ์Šค๋ ˆ๋“œ์—์„œ ์‹คํ–‰๋˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

์ด์ œ ์ž‘์—… ์ˆ˜๋ฅผ 100๊ฐœ๋กœ ๋Š˜๋ฆฌ๊ณ  100๊ฐœ ์ž‘์—…์„ ์ œ์ถœํ•œ ํ›„ awaitTermination (11, SECONDS) ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค. ์ˆซ์ž์™€ ์‹œ๊ฐ„ ๋‹จ์œ„๋ฅผ ์ธ์ˆ˜๋กœ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ฐฉ๋ฒ•์€ ๋ฉ”์ธ ์Šค๋ ˆ๋“œ๋ฅผ 11์ดˆ ๋™์•ˆ ์ฐจ๋‹จํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ shutdownNow()๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ๋ชจ๋“  ์ž‘์—…์ด ์™„๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š๊ณ  ExecutorService๋ฅผ ๊ฐ•์ œ ๋กœ ์ข…๋ฃŒํ•ฉ๋‹ˆ๋‹ค.


ExecutorService executorService = Executors.newFixedThreadPool(3);
 
        for (int i = 0; i < 100; i++) {
            executorService.execute(new Task(i));
        }
 
        executorService.awaitTermination(11, SECONDS);
 
        executorService.shutdownNow();
        System.out.println(executorService);
    

๋งˆ์ง€๋ง‰์—๋Š” executorService ์˜ ์ƒํƒœ์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค .

์šฐ๋ฆฌ๊ฐ€ ์–ป๋Š” ์ฝ˜์†” ์ถœ๋ ฅ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

pool-1-thread-1 ์Šค๋ ˆ๋“œ์—์„œ ์ฒ˜๋ฆฌ๋œ ์‚ฌ์šฉ์ž ์š”์ฒญ #
0 pool-1-thread-3 ์Šค๋ ˆ๋“œ์—์„œ
์ฒ˜๋ฆฌ๋œ ์‚ฌ์šฉ์ž ์š”์ฒญ #2 pool-1-thread-2 ์Šค๋ ˆ๋“œ์—์„œ ์ฒ˜๋ฆฌ๋œ ์‚ฌ์šฉ์ž ์š”์ฒญ #1 ํ’€-1-thread-2 ์Šค๋ ˆ๋“œ์—์„œ
์ฒ˜๋ฆฌ๋œ ์‚ฌ์šฉ์ž ์š”์ฒญ #4 1-thread-3 ์Šค๋ ˆ๋“œ
pool-1-thread-2 ์Šค๋ ˆ๋“œ์—์„œ ์ฒ˜๋ฆฌ๋œ ์‚ฌ์šฉ์ž ์š”์ฒญ #5
pool-1-thread-1 ์Šค๋ ˆ๋“œ์—์„œ ์ฒ˜๋ฆฌ๋œ ์‚ฌ์šฉ์ž ์š”์ฒญ #3
pool-1-thread-3 ์Šค๋ ˆ๋“œ์—์„œ ์ฒ˜๋ฆฌ๋œ ์‚ฌ์šฉ์ž ์š”์ฒญ #6
์ฒ˜๋ฆฌ๋œ ์‚ฌ์šฉ์ž pool-1-thread-2 ์Šค๋ ˆ๋“œ์—์„œ ์š”์ฒญ #7 pool-
1-thread-1 ์Šค๋ ˆ๋“œ์—์„œ ์ฒ˜๋ฆฌ๋œ ์‚ฌ์šฉ์ž ์š”์ฒญ #8 pool-1
-thread-3 ์Šค๋ ˆ๋“œ์—์„œ ์ฒ˜๋ฆฌ๋œ ์‚ฌ์šฉ์ž ์š”์ฒญ #9
pool-1-์—์„œ ์ฒ˜๋ฆฌ๋œ ์‚ฌ์šฉ์ž ์š”์ฒญ #11 thread-1 ์Šค๋ ˆ๋“œ
pool-1-thread-2 ์Šค๋ ˆ๋“œ์—์„œ ์ฒ˜๋ฆฌ๋œ ์‚ฌ์šฉ์ž ์š”์ฒญ #10
pool-1-thread-1 ์Šค๋ ˆ๋“œ์—์„œ ์ฒ˜๋ฆฌ๋œ ์‚ฌ์šฉ์ž ์š”์ฒญ #13
pool-1-thread-2 ์Šค๋ ˆ๋“œ์—์„œ ์ฒ˜๋ฆฌ๋œ ์‚ฌ์šฉ์ž ์š”์ฒญ #14
pool-1-thread-3 ์Šค๋ ˆ๋“œ์—์„œ ์ฒ˜๋ฆฌ๋œ ์‚ฌ์šฉ์ž ์š”์ฒญ #12
java.util.concurrent.ThreadPoolExecutor@452b3a41[์ข…๋ฃŒ ์ค‘, ํ’€ ํฌ๊ธฐ = 3, ํ™œ์„ฑ ์Šค๋ ˆ๋“œ = 3 , ๋Œ€๊ธฐ ์ค‘์ธ ์ž‘์—… = 0, ์™„๋ฃŒ๋œ ์ž‘์—… = 15]
pool-1-thread-3 ์Šค๋ ˆ๋“œ์—์„œ ์ฒ˜๋ฆฌ๋œ ์‚ฌ์šฉ์ž ์š”์ฒญ #17 pool-1
-thread-1 ์Šค๋ ˆ๋“œ์—์„œ ์ฒ˜๋ฆฌ๋œ ์‚ฌ์šฉ์ž ์š”์ฒญ #15
pool-1-thread์—์„œ ์ฒ˜๋ฆฌ๋œ ์‚ฌ์šฉ์ž ์š”์ฒญ #16 -2 ์Šค๋ ˆ๋“œ

๊ทธ ๋‹ค์Œ์—๋Š” 3๊ฐœ์˜ ํ™œ์„ฑ ์ž‘์—…์—์„œ ์ ˆ์ „ ๋ฉ”์„œ๋“œ ์— ์˜ํ•ด ๋ฐœ์ƒํ•œ 3๊ฐœ์˜ InterruptedExceptions๊ฐ€ ๋’ค๋”ฐ๋ฆ…๋‹ˆ๋‹ค .

ํ”„๋กœ๊ทธ๋žจ์ด ์ข…๋ฃŒ๋˜๋ฉด 15๊ฐœ์˜ ์ž‘์—…์ด ์™„๋ฃŒ๋˜์ง€๋งŒ ํ’€์—๋Š” ์—ฌ์ „ํžˆ ์ž‘์—… ์‹คํ–‰์„ ์™„๋ฃŒํ•˜์ง€ ์•Š์€ 3๊ฐœ์˜ ํ™œ์„ฑ ์Šค๋ ˆ๋“œ๊ฐ€ ์žˆ์Œ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ์„ธ ์Šค๋ ˆ๋“œ์—์„œ interrupt () ๋ฉ”์„œ๋“œ๊ฐ€ ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค. ์ฆ‰, ์ž‘์—…์ด ์™„๋ฃŒ๋˜์ง€๋งŒ ์šฐ๋ฆฌ์˜ ๊ฒฝ์šฐ sleep ๋ฉ”์„œ๋“œ๋Š” InterruptedException ์„ ๋ฐœ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค . ๋˜ํ•œ shutdownNow() ๋ฉ”์„œ๋“œ๊ฐ€ ํ˜ธ์ถœ๋œ ํ›„ ์ž‘์—… ๋Œ€๊ธฐ์—ด์ด ์ง€์›Œ์ง€๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ํ’€์—์„œ ๊ณ ์ •๋œ ์ˆ˜์˜ ์Šค๋ ˆ๋“œ์™€ ํ•จ๊ป˜ ExecutorService๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ์ž‘๋™ ๋ฐฉ์‹์„ ๊ธฐ์–ตํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด ์œ ํ˜•์€ ์ผ์ •ํ•œ ๋ถ€ํ•˜๊ฐ€ ์•Œ๋ ค์ง„ ์ž‘์—…์— ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์— ๋˜ ๋‹ค๋ฅธ ํฅ๋ฏธ๋กœ์šด ์งˆ๋ฌธ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹จ์ผ ์Šค๋ ˆ๋“œ์— ๋Œ€ํ•ด ์‹คํ–‰๊ธฐ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ ์–ด๋–ค ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ? newSingleThreadExecutor() ๋˜๋Š” newFixedThreadPool(1) ?

๋‘ ์‹คํ–‰๊ธฐ ๋ชจ๋‘ ๋™์ผํ•œ ๋™์ž‘์„ ํ•ฉ๋‹ˆ๋‹ค. ์œ ์ผํ•œ ์ฐจ์ด์ ์€ newSingleThreadExecutor() ๋ฉ”์„œ๋“œ๊ฐ€ ๋‚˜์ค‘์— ์ถ”๊ฐ€ ์Šค๋ ˆ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ์žฌ๊ตฌ์„ฑํ•  ์ˆ˜ ์—†๋Š” ์‹คํ–‰๊ธฐ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.