[Spring] ThreadPoolTaskExecutor

๊ทธ๋ƒฅ ์ค€ํ˜„ยท2024๋…„ 7์›” 23์ผ
0

Computer Science

๋ชฉ๋ก ๋ณด๊ธฐ
13/16

๐Ÿ’ก ์ด ๊ธ€์€ ํšŒ์‚ฌ ์ธํ„ด ๊ธฐ๊ฐ„์— ์Šคํ„ฐ๋””ํ•œ ๋‚ด์šฉ์„ ์ •๋ฆฌํ•œ ๊ธ€์ž…๋‹ˆ๋‹ค!

1. Thread Pool

1.1 ํ•„์š”์„ฑ

์“ฐ๋ ˆ๋“œํ’€(Thread Pool)์„ ์ •์˜ํ•˜๊ธฐ์— ์•ž์„œ ๋ฌธ์ œ ์ƒํ™ฉ ํ•˜๋‚˜๋ฅผ ๋จผ์ € ์ƒ๊ฐํ•ด๋ณด์ž.

์‚ฌ์šฉ์ž ์š”์ฒญ์ด ๋“ค์–ด์˜ฌ ๋•Œ๋งˆ๋‹ค ์“ฐ๋ ˆ๋“œ๋ฅผ ๋งŒ๋“ค๊ณ  ์‹ถ๋‹ค!
์ด๋Ÿฐ ๊ตฌ์กฐ๋Š” ํŠนํžˆ ์›น์—์„œ ๋งค์šฐ ํ”ํ•˜๋‹ค.

์‚ฌ์šฉ์ž ์š”์ฒญ๋งˆ๋‹ค ์“ฐ๋ ˆ๋“œ๋ฅผ ์ƒˆ๋กœ ๋งŒ๋“ค์–ด์„œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋„๋ก ๊ตฌํ˜„ํ–ˆ๋‹ค.
๋งŒ์•ฝ ์‚ฌ์šฉ์ž ์š”์ฒญ์ด ๋งŽ์•„์ง€๋ฉด ์–ด๋–ป๊ฒŒ ๋ ๊นŒ?

์“ฐ๋ ˆ๋“œ๊ฐ€ ๋„ˆ๋ฌด ๋งŽ์•„์ ธ์„œ ํ”„๋กœ๊ทธ๋žจ์ด ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ๋™์ž‘์„ ํ•  ์ˆ˜ ์žˆ๋‹ค.
์‹ฌํ•œ ๊ฒฝ์šฐ ํ”„๋กœ๊ทธ๋žจ์ด ์ข…๋ฃŒ๋œ๋‹ค..!

๊ทธ๋ž˜์„œ ์“ฐ๋ ˆ๋“œํ’€(Thread Pool)์„ ์‚ฌ์šฉํ•ด ์ด๋Ÿฐ ์ƒํ™ฉ์„ ์˜ˆ๋ฐฉํ•œ๋‹ค.

1.2 ๊ฐœ๋…

๊ฐœ๋ฐœ ๋ถ„์•ผ์—์„œ๋Š” Pool์ด๋ผ๋Š” ๋‹จ์–ด๊ฐ€ ํ”ํ•˜๊ฒŒ ์‚ฌ์šฉ๋œ๋‹ค.(Connection Pool, Thread Pool ...)
๊ฐœ๋ฐœ ๋ถ„์•ผ์—์„œ Pool์ด๋ž€, ์–ด๋–ค ๋Œ€์ƒ์„ Pool์— ์—ฌ๋Ÿฌ๊ฐœ ๋„ฃ์–ด๋‘๊ณ  ๊ด€๋ฆฌํ•˜๋Š” ๋Š๋‚Œ์œผ๋กœ ์‚ฌ์šฉํ•œ๋‹ค.

๊ทธ๋ž˜์„œ ์“ฐ๋ ˆ๋“œํ’€(Thread Pool)๋„ ์—ฌ๋Ÿฌ ์“ฐ๋ ˆ๋“œ๋ฅผ Pool์— ๋„ฃ์–ด๋‘๊ณ  ๊ด€๋ฆฌํ•˜๋ฉฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค€๋‹ค.

1.3 ์žฅ์ 

1.3.1 ์ž์› ํšจ์œจ์„ฑ

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

1.3.2 ์ž‘์—… ์ œ์–ด

์œ„์—์„œ ์„ค๋ช…ํ–ˆ๋“ฏ์ด ์“ฐ๋ ˆ๋“œํ’€์€ ์“ฐ๋ ˆ๋“œ ๊ฐฏ์ˆ˜๋ฅผ ์กฐ์ ˆํ•  ์ˆ˜ ์žˆ๋‹ค.
์“ฐ๋ ˆ๋“œ ๊ฐฏ์ˆ˜๋ฅผ ๋งŽ๊ฒŒ ํ•˜๋ฉด ์š”์ฒญ์ด ๋งŽ์•„์กŒ์„ ๋•Œ ๋ถ€ํ•˜๋ฅผ ์ค„์ผ ์ˆ˜ ์žˆ๋‹ค.
์“ฐ๋ ˆ๋“œ ๊ฐฏ์ˆ˜๋ฅผ ์ ๊ฒŒ ํ•˜๋ฉด ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ ˆ์•ฝํ•  ์ˆ˜ ์žˆ๋‹ค.
ํ”„๋กœ๊ทธ๋žจ์˜ ํŠน์„ฑ์— ๋งž๊ฒŒ ์ž‘์—…์„ ์ œ์–ดํ•  ์ˆ˜ ์žˆ๋‹ค.

1.3.3 ์“ฐ๋ ˆ๋“œ ๊ด€๋ฆฌ

๋’ค์—์„œ ์„ค๋ช…ํ•  ์—ฌ๋Ÿฌ ์˜ต์…˜์„ ํ™œ์šฉํ•˜์—ฌ ์“ฐ๋ ˆ๋“œ์˜ ์ƒ๋ช… ์ฃผ๊ธฐ๋ฅผ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.

1.4 ๋‹จ์ 

1.4.1 ์œ ์—ฐํ•˜์ง€ ๋ชปํ•œ ๋Œ€๊ธฐ์‹œ๊ฐ„

1๋ถ„ ๊ฑธ๋ฆฌ๋Š” ์ž‘์—…๊ณผ 1์ดˆ ๊ฑธ๋ฆฌ๋Š” ์ž‘์—…์ด ์„ž์—ฌ์„œ ์“ฐ๋ ˆ๋“œํ’€์„ ์‚ฌ์šฉํ•œ ํ”„๋กœ๊ทธ๋žจ์— ๋“ค์–ด์˜จ๋‹ค๊ณ  ์ƒ๊ฐํ•ด๋ณด์ž.
์‹œ๊ฐ„์ด ์ข€ ์ง€๋‚˜๊ณ ๋‚˜๋ฉด ์“ฐ๋ ˆ๋“œํ’€์˜ ์“ฐ๋ ˆ๋“œ๋“ค์€ ๋ชจ๋‘ 1๋ถ„ ๊ฑธ๋ฆฌ๋Š” ์ž‘์—…์ด ์ง„ํ–‰์ค‘์ผ ๊ฒƒ์ด๋‹ค.
๊ทธ๋Ÿฌ๋ฉด ๊ทธ ๋’ค์— ๋“ค์–ด์˜ค๋Š” 1์ดˆ ๊ฑธ๋ฆฌ๋Š” ์ž‘์—…๋“ค์€ ์‹ค์ œ ์ž‘์—… ์‹œ๊ฐ„๋ณด๋‹ค ํ›จ์”ฌ ๊ธด ์‹œ๊ฐ„์„ ๋Œ€๊ธฐ์‹œ๊ฐ„์œผ๋กœ ์†Œ๋ชจํ•˜๊ฒŒ ๋œ๋‹ค.

์ด๋ ‡๊ฒŒ ์ž‘์—…์˜ ํฌ๊ธฐ๊ฐ€ ์ฐจ์ด๋‚˜๋Š” ์ž‘์—…๋“ค์ด ์„ž์—ฌ ๋“ค์–ด์˜ฌ ๊ฒฝ์šฐ ๋น„ํšจ์œจ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.

1.4.2 ๋ฐ๋“œ๋ฝ ๋ฐœ์ƒ ๊ฐ€๋Šฅ

์ด๊ฑด ์“ฐ๋ ˆ๋“œํ’€์˜ ๋‹จ์ ์ด๋ผ๊ธฐ๋ณด๋‹ค๋Š” ๋ฉ€ํ‹ฐ์“ฐ๋ ˆ๋“œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์— ๋Œ€ํ‘œ์ ์ธ ์ฃผ์˜์ ์ด๋‹ค.
๊ฐ ์“ฐ๋ ˆ๋“œ๊ฐ€ ์ˆ˜ํ–‰ํ•˜๋Š” ์ž‘์—… ๊ฐ„์— ์˜์กด์„ฑ์ด ์กด์žฌํ•œ๋‹ค๋ฉด ๋ฐ๋“œ๋ฝ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.

1.5 ์‚ฌ์šฉํ•˜๊ธฐ ์ข‹์€ ์ƒํ™ฉ

์œ„ ๋‹จ์ ์„ ์กฐํ•ฉํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒฐ๋ก ์„ ๋‚ด๋ฆด ์ˆ˜ ์žˆ๋‹ค.

์“ฐ๋ ˆ๋“œํ’€์€ ์‹คํ–‰ ๊ทœ๋ชจ๊ฐ€ ๋น„์Šทํ•˜๊ณ  ์„œ๋กœ ๋…๋ฆฝ์ ์ธ ์ž‘์—…์ผ ๋•Œ ์‚ฌ์šฉํ•˜๊ธฐ ์ข‹๋‹ค!

์ฆ‰, ์›น ๊ฐœ๋ฐœ์—์„œ ์‚ฌ์šฉํ•˜๊ธฐ ์ข‹๋‹ค.

1.6 Java vs Spring

Java์—์„œ๋Š” java.util.concurrent ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ํ™œ์šฉํ•ด ์“ฐ๋ ˆ๋“œํ’€์„ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.
Spring์—์„œ๋Š” ThreadPoolTaskExecutor ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ํ™œ์šฉํ•ด ์“ฐ๋ ˆ๋“œํ’€์„ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.

Java์˜ ์“ฐ๋ ˆ๋“œํ’€ ๊ด€๋ฆฌ๋Š” ๊ฒฝ๋Ÿ‰์ด๋ฉฐ ํ”„๋ ˆ์ž„์›Œํฌ ์˜์กด์„ฑ์ด ๋‚ฎ์€ ๊ฒŒ ์žฅ์ ์ด๋‹ค.
Spring์˜ ์“ฐ๋ ˆ๋“œํ’€ ๊ด€๋ฆฌ๋Š” ์—ฌ๋Ÿฌ ์–ด๋…ธํ…Œ์ด์…˜๊ณผ ํ†ตํ•ฉํ•  ์ˆ˜ ์žˆ๊ณ  ์ด๋ฅผ ํ†ตํ•ด ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ๊ฐ„๊ฒฐํ•˜๊ฒŒ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒŒ ์žฅ์ ์ด๋‹ค.

์šฐ๋ฆฌ๋Š” Spring ๊ด€์ ์—์„œ ์ข€ ๋” ์ž์„ธํžˆ ๋“ค์—ฌ๋‹ค๋ณด์ž.

2. Task Executor

2.1 ๊ฐœ๋…

TaskExecutor์— ๋Œ€ํ•ด์„œ ๋จผ์ € ์•Œ์•„๋ณด์ž.

TaskExecutor๋Š” Spring์—์„œ ๋น„๋™๊ธฐ ์ž‘์—… ์‹คํ–‰์„ ์ถ”์ƒํ™”ํ•œ ์ธํ„ฐํŽ˜์ด์Šค์ž…๋‹ˆ๋‹ค.
๊ตฌํ˜„์ฒด๋กœ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ข…๋ฅ˜๊ฐ€ ์žˆ๋‹ค.

  • SimpleAsyncTaskExecutor (Default)
  • SyncTaskExecutor
  • ConcurrentTaskExecutor
  • ThreadPoolTaskExecutor

SimpleAsyncTaskExecutor๋Š” Spring์—์„œ ๋น„๋™๊ธฐ๋ฅผ ์ˆ˜ํ–‰ํ•  ๋•Œ ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ์„ค์ •๋˜๋Š” TaskExecutor์ด๋‹ค.
SimpleAsyncTaskExecutor๋Š” ์š”์ฒญ์ด ๋“ค์–ด์˜ฌ ๋•Œ๋งˆ๋‹ค ์“ฐ๋ ˆ๋“œ๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.
์ตœ๋Œ€ ์“ฐ๋ ˆ๋“œ ๊ฐฏ์ˆ˜๋Š” ์„ค์ •ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๊ทธ ์™ธ์— ์ž์„ธํ•œ ์„ค์ •์€ ์–ด๋ ค์›Œ์„œ TreadPoolTaskExecutor๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ๋ฅผ ๊ถŒ์žฅํ•œ๋‹ค.

2.2 @Async์™€์˜ ๊ด€๊ณ„

TaskExecutor๋Š” ๋น„๋™๊ธฐ ์ž‘์—… ์‹คํ–‰์„ ํ•˜๊ธฐ ์œ„ํ•ด ๋งŒ๋“ค์–ด์กŒ๋‹ค.
@Async ์–ด๋…ธํ…Œ์ด์…˜์„ ์‚ฌ์šฉํ•œ ๋ฉ”์„œ๋“œ๋Š” ๋‹ค๋ฅธ ์“ฐ๋ ˆ๋“œ์—์„œ ๋น„๋™๊ธฐ๋กœ ์‹คํ–‰๋œ๋‹ค.
๊ธฐ๋ณธ์ ์œผ๋กœ๋Š” SimpleAsyncTaskExecutor๋ฅผ ์ด์šฉํ•ด ์“ฐ๋ ˆ๋“œ๋ฅผ ๊ด€๋ฆฌํ•˜์ง€๋งŒ Param์„ ํ†ตํ•ด ํŠน์ • TaskExecutor๋ฅผ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

2.3 ์˜ˆ์ œ ์ฝ”๋“œ

@Configuration
@EnableAsync
public class ThreadPoolConfig {

    @Bean(name = "taskExecutor")
    public Executor taskExecutor() {
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        executor.setCorePoolSize(5);
        executor.setMaxPoolSize(10);
        executor.setQueueCapacity(25);
        executor.setThreadNamePrefix("Thread-");
        executor.setRejectedExecutionHandler(new ThreadPoolExecutor.DiscardPolicy());
        executor.setWaitForTasksToCompleteOnShutdown(true);
        executor.setAwaitTerminationSeconds(30);
        executor.initialize();
        
        return executor;
    }
}

์œ„ ์ฝ”๋“œ๋Š” Config ํด๋ž˜์Šค๋‹ค.
@Bean ์–ด๋…ธํ…Œ์ด์…˜์œผ๋กœ ์ด๋ฆ„์„ ์ง€์ •ํ•ด์„œ taskExecutor๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์žˆ๋‹ค.
์—ฌ๋Ÿฌ ์„ค์ •์ด ๋ณด์ด๋Š”๋ฐ ์ด๋Š” 2.4 ์˜ต์…˜ ๋ฐ ์„ค์ •์—์„œ ์ž์„ธํžˆ ๋ณด๋„๋ก ํ•˜์ž.

@RestController
public class ThreadPoolController {

    @Autowired
    private ThreadPoolService threadPoolService;

    @GetMapping("/start-tasks")
    public String startTasks(@RequestParam(defaultValue = "10") int taskCount) {
        for (int i = 0; i < taskCount; i++) {
            threadPoolService.executeTask("Task " + i);
        }
        return taskCount + " Tasks done!";
    }
}

์œ„๋Š” Controller ์ฝ”๋“œ์ด๋‹ค.
Service์˜ executeTask() ๋ฉ”์„œ๋“œ๋ฅผ ๋ฐ˜๋ณตํ•ด์„œ ํ˜ธ์ถœํ•˜๊ณ  ์žˆ๋‹ค.
ํ•ด๋‹น ๋ฉ”์„œ๋“œ๋Š” ๋น„๋™๊ธฐ๋กœ ThreadPoolTaskExecutor๋ฅผ ํ™œ์šฉํ•ด ๋ฉ€ํ‹ฐ์“ฐ๋ ˆ๋“œ ์ž‘์—…์„ ํ•˜๊ณ  ์žˆ๋‹ค.

@Service
public class ThreadPoolService {

    @Async("taskExecutor")
    public void executeTask(String task) {
        System.out.println(Thread.currentThread().getName() + " is processing " + task);
        try {
            Thread.sleep(2000); // Simulate task
        } catch (InterruptedException e) {
            Thread.currentThread().interrupt();
        }
    }
}

์œ„๋Š” Service ์ฝ”๋“œ์ด๋‹ค.
ThreadPoolTaskExecutor๋ฅผ ์ง€์ •ํ•ด์„œ ๋น„๋™๊ธฐ๋กœ ์ž‘์—…ํ•œ๋‹ค.
2์ดˆ ๋Œ€๊ธฐ์™€ ๋กœ๊ทธ๋ฅผ ์ฐ๋Š” ์ž‘์—…์„ ๋„ฃ์–ด ๋ฉ€ํ‹ฐ์“ฐ๋ ˆ๋“œ ๋™์ž‘์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

์œ„ ์ฝ”๋“œ๋ฅผ ๋™์ž‘ํ•˜๋ฉด ๋ธŒ๋ผ์šฐ์ €์™€ ์ฝ˜์†”์—์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒฐ๊ณผ๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

2.4 ์˜ต์…˜ ๋ฐ ์„ค์ •

์—ฌ๋Ÿฌ ์˜ต์…˜์ด ์žˆ์ง€๋งŒ ๋Œ€ํ‘œ์ ์ธ 7๊ฐ€์ง€ ์˜ต์…˜๋งŒ ์‚ดํŽด๋ณด์ž.

2.4.1 setCorePoolSize

๊ธฐ๋ณธ ์“ฐ๋ ˆ๋“œ ๊ฐฏ์ˆ˜๋ฅผ ์˜๋ฏธํ•œ๋‹ค.
์ตœ์†Œ ์“ฐ๋ ˆ๋“œ ๊ฐฏ์ˆ˜๋กœ ์ดํ•ดํ•˜๋ฉด ๋œ๋‹ค.
ํ”„๋กœ๊ทธ๋žจ์ด ๊ตฌ๋™๋  ๋•Œ ์ƒ์„ฑํ•˜์—ฌ ์ข…๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ์œ ์ง€๋œ๋‹ค.

๊ธฐ๋ณธ๊ฐ’์€ 1์ด๋‹ค.

2.4.2 setMaxPoolSize

์ตœ๋Œ€ ์“ฐ๋ ˆ๋“œ ๊ฐฏ์ˆ˜๋ฅผ ์˜๋ฏธํ•œ๋‹ค.
corePoolSize๋งŒํผ์˜ ์“ฐ๋ ˆ๋“œ๊ฐ€ ๋ชจ๋‘ ์ž‘์—…์ค‘์ผ ๋•Œ ์ƒˆ๋กœ์šด ์ž‘์—…์ด ๋“ค์–ด์˜ค๋ฉด ์ถ”๊ฐ€ ์“ฐ๋ ˆ๋“œ๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.
๊ทธ๋ฆฌ๊ณ  ์“ฐ๋ ˆ๋“œ๋Š” ๊ธฐ๋ณธ ์“ฐ๋ ˆ๋“œ๊นŒ์ง€ ํฌํ•จํ•ด์„œ ์ตœ๋Œ€ MaxPoolSize๋งŒํผ ๊ฐ€์ง€๊ณ  ์žˆ์„ ์ˆ˜ ์žˆ๋‹ค.

๊ธฐ๋ณธ๊ฐ’์€ Integer.MAX_VALUE์ด๋‹ค.

2.4.3 setQueueCapacity

ํ์˜ ์šฉ๋Ÿ‰์ด๋‹ค.
์šฉ๋Ÿ‰์ด ๊ฐ€๋“์ฐผ๋Š”๋ฐ ์ƒˆ๋กœ์šด ์ž‘์—…์„ ๋„ฃ์œผ๋ ค๊ณ  ํ•˜๋ฉด RejectedExecutionHandler์— ์ •์˜๋œ ์ •์ฑ…๋Œ€๋กœ ํ–‰๋™ํ•œ๋‹ค.

๊ธฐ๋ณธ๊ฐ’์€ Integer.MAX_VALUE์ด๋‹ค.

2.4.4 setThreadNamePrefix

์“ฐ๋ ˆ๋“œ์˜ ์ด๋ฆ„์„ ์„ค์ •ํ•œ๋‹ค.
๊ธฐ๋ณธ๊ฐ’์€ ํด๋ž˜์Šค ์ด๋ฆ„์ด๋‹ค.

2.4.5 setRejectedExecutionHandler

ํ ์šฉ๋Ÿ‰์„ ์ดˆ๊ณผํ•˜์—ฌ ์ž‘์—…์ด ์™”์„ ๋•Œ, ์ฒ˜๋ฆฌ ์ •์ฑ…์ด๋‹ค.
์ •์ฑ…์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ข…๋ฅ˜๊ฐ€ ์žˆ๋‹ค.

  • AbortPolicy (Default)
  • DiscardPolicy
  • DiscardOldestPolicy
  • CallerRunsPolicy

ํ•˜๋‚˜์”ฉ ์‚ดํŽด๋ณด์ž.

AbortPolicy (Default)

๊ฑฐ๋ถ€ ์ •์ฑ…์ด๋‹ค.
RejectedExecutionException์„ ๋˜์ง„๋‹ค.

์ด๋ฅผ ํ†ตํ•ด ์‚ฌ์šฉ์ž์—๊ฒŒ ์•ˆ๋‚ดํ•ด์„œ ์„œ๋ฒ„ ๋ถ€ํ•˜๋ฅผ ๋ง‰์„ ์ˆ˜ ์žˆ๋‹ค.

DiscardPolicy

์ƒˆ๋กœ์šด ์ž‘์—…์„ ๊ฑฐ๋ถ€ํ•œ๋‹ค.
์ž‘์—…์„ ๋ฒ„๋ฆฌ๊ณ  ์˜ˆ์™ธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค์ง€ ์•Š๋Š”๋‹ค.

DiscardOldestPolicy

ํ์—์„œ ๊ฐ€์žฅ ์˜ค๋ž˜๋œ ์ž‘์—…์„ ๋ฒ„๋ฆฐ๋‹ค.
๊ทธ๋ฆฌ๊ณ  ์ƒˆ๋กœ์šด ์ž‘์—…์„ ํ์— ์ถ”๊ฐ€ํ•œ๋‹ค.

์ตœ์‹  ์š”์ฒญ ์ž‘์—…์ด ๋” ์ค‘์š”ํ•œ ๊ฒฝ์šฐ์— ์‚ฌ์šฉํ•œ๋‹ค.

CallerRunsPolicy

์ž‘์—…์„ ํ˜ธ์ถœํ•œ ์“ฐ๋ ˆ๋“œ์—์„œ ์ง์ ‘ ์‹คํ–‰ํ•œ๋‹ค.
๋ถ€ํ•˜๋ฅผ ์ข€ ๋” ์œ ๋™์ ์œผ๋กœ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.

์–ด๋–ค ์ž‘์—…๋„ ๋ฒ„๋ ค์ง€๊ธฐ๋ฅผ ์›์น˜ ์•Š์„ ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.

2.4.6 setWaitForTasksToCompleteOnShutdown

์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์ข…๋ฃŒ๋  ๋•Œ ๋™์ž‘์„ ์ง€์ •ํžŒ๋‹ค.
false(Default)์ธ ๊ฒฝ์šฐ, ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์ฆ‰์‹œ ์ข…๋ฃŒ๋œ๋‹ค.
true์ธ ๊ฒฝ์šฐ, ์“ฐ๋ ˆ๋“œ์—์„œ ์ˆ˜ํ–‰์ค‘์ด๋˜ ์ž‘์—…๊ณผ ํ์— ๋‚จ์€ ์ž‘์—…๊นŒ์ง€ ๋ชจ๋‘ ์ˆ˜ํ–‰ํ•œ ํ›„ ์ข…๋ฃŒ๋œ๋‹ค.

2.4.7 setAwaitTerminationSeconds

2.4.6 setWaitForTasksToCompleteOnShutdown๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉ๋œ๋‹ค.
setWaitForTasksToCompleteOnShutdown ๊ฐ’์ด true์ธ ๊ฒฝ์šฐ, ํ”„๋กœ๊ทธ๋žจ ์ข…๋ฃŒ๊นŒ์ง€ ๋Œ€๊ธฐํ•  ์‹œ๊ฐ„์„ ์ง€์ •ํ•œ๋‹ค.

๊ธฐ๋ณธ๊ฐ’์€ 0์œผ๋กœ ์“ฐ๋ ˆ๋“œ์—์„œ ์ˆ˜ํ–‰์ค‘์ด๋˜ ์ž‘์—…๊ณผ ํ์— ๋‚จ์€ ์ž‘์—…์ด ๋ชจ๋‘ ๋๋‚  ๋•Œ๊นŒ์ง€ ๋Œ€๊ธฐํ•œ๋‹ค.

profile
์ž˜ํ•ด์•ผ ์žฌ๋ฐŒ์–ด

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

๊ด€๋ จ ์ฑ„์šฉ ์ •๋ณด