์šฐ๋ฆฌ๋ฅผ ์œ„ํ•ด ExecutorService๋ฅผ ์ค€๋น„ํ•˜๋Š” newWorkStealingPool ๋ฉ”์„œ๋“œ๋ฅผ ์•Œ์•„๋ด…์‹œ๋‹ค .

์ด ์Šค๋ ˆ๋“œ ํ’€์€ ํŠน๋ณ„ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์˜ ํ–‰๋™์€ "๋„๋‘‘์งˆ" ์ž‘์—…์˜ ์•„์ด๋””์–ด๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•ฉ๋‹ˆ๋‹ค.

์ž‘์—…์€ ๋Œ€๊ธฐํ•˜๊ณ  ํ”„๋กœ์„ธ์„œ ๊ฐ„์— ๋ถ„์‚ฐ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ํ”„๋กœ์„ธ์„œ๊ฐ€ ์‚ฌ์šฉ ์ค‘์ด๋ฉด ๋‹ค๋ฅธ ๋ฌด๋ฃŒ ํ”„๋กœ์„ธ์„œ๊ฐ€ ์ž‘์—…์„ ํ›”์ณ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ํ˜•์‹์€ ๋‹ค์ค‘ ์Šค๋ ˆ๋“œ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์—์„œ ์ถฉ๋Œ์„ ์ค„์ด๊ธฐ ์œ„ํ•ด Java์—์„œ ๋„์ž…๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ํฌํฌ/์กฐ์ธ ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•ฉ๋‹ˆ๋‹ค .

ํฌํฌ/์กฐ์ธ

ํฌํฌ/์กฐ์ธ ํ”„๋ ˆ์ž„์›Œํฌ ์—์„œ ์ž‘์—…์€ ์žฌ๊ท€์ ์œผ๋กœ ๋ถ„ํ•ด๋ฉ๋‹ˆ๋‹ค. ์ฆ‰, ํ•˜์œ„ ์ž‘์—…์œผ๋กœ ๋‚˜๋‰ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ํ•˜์œ„ ์ž‘์—…์ด ๊ฐœ๋ณ„์ ์œผ๋กœ ์‹คํ–‰๋˜๊ณ  ํ•˜์œ„ ์ž‘์—…์˜ ๊ฒฐ๊ณผ๊ฐ€ ๊ฒฐํ•ฉ๋˜์–ด ์›๋ž˜ ์ž‘์—…์˜ ๊ฒฐ๊ณผ๋ฅผ ํ˜•์„ฑํ•ฉ๋‹ˆ๋‹ค.

fork ๋ฉ”์„œ๋“œ๋Š” ์ผ๋ถ€ ์Šค๋ ˆ๋“œ์—์„œ ๋น„๋™๊ธฐ์ ์œผ๋กœ ์ž‘์—…์„ ์‹œ์ž‘ํ•˜๊ณ  join ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉ ํ•˜๋ฉด ์ด ์ž‘์—…์ด ์™„๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

newWorkStealingPool

newWorkStealingPool ๋ฉ”์†Œ๋“œ ์—๋Š” ๋‘ ๊ฐ€์ง€ ๊ตฌํ˜„์ด ์žˆ์Šต๋‹ˆ๋‹ค.


public static ExecutorService newWorkStealingPool(int parallelism) {
        return new ForkJoinPool
            (parallelism,
             ForkJoinPool.defaultForkJoinWorkerThreadFactory,
             null, true);
    }
 
public static ExecutorService newWorkStealingPool() {
        return new ForkJoinPool
            (Runtime.getRuntime().availableProcessors(),
             ForkJoinPool.defaultForkJoinWorkerThreadFactory,
             null, true);
    }

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

์šฐ๋ฆฌ๋Š” ์„ ํƒํ•  ์ˆ˜ ์žˆ๋Š” 2๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ฒซ ๋ฒˆ์งธ์—์„œ ์šฐ๋ฆฌ๋Š” ์šฐ๋ฆฌ๊ฐ€ ๋ณด๊ณ  ์‹ถ์€ ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ ์ˆ˜์ค€์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. ์ด ๊ฐ’์„ ์ง€์ •ํ•˜์ง€ ์•Š์œผ๋ฉด ํ’€์˜ ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ๋Š” JVM(Java Virtual Machine)์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ํ”„๋กœ์„ธ์„œ ์ฝ”์–ด์˜ ์ˆ˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์‹ค์ œ๋กœ ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•˜๋Š”์ง€ ํŒŒ์•…ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.


Collection<Callable<Void>> tasks = new ArrayList<>();
        ExecutorService executorService = Executors.newWorkStealingPool(10);
 
        for (int i = 0; i < 10; i++) {
            int taskNumber = i;
            Callable<Void> callable = () -> {
                System.out.println("Processed user request #" + taskNumber + " on thread " + Thread.currentThread().getName());
                return null;
            };
            tasks.add(callable);
        }
        executorService.invokeAll(tasks);

์ž์ฒด ์™„๋ฃŒ ์ƒํƒœ๋ฅผ ํ‘œ์‹œํ•˜๋Š” 10๊ฐœ์˜ ์ž‘์—…์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ invokeAll ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ชจ๋“  ์ž‘์—…์„ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.

ํ’€์˜ 10๊ฐœ ์Šค๋ ˆ๋“œ์—์„œ 10๊ฐœ์˜ ์ž‘์—…์„ ์‹คํ–‰ํ•  ๋•Œ์˜ ๊ฒฐ๊ณผ:

ForkJoinPool-1-worker-10 ์Šค๋ ˆ๋“œ์—์„œ ์ฒ˜๋ฆฌ๋œ ์‚ฌ์šฉ์ž ์š”์ฒญ #9
ForkJoinPool-1-worker-5 ์Šค๋ ˆ๋“œ์—์„œ
์ฒ˜๋ฆฌ๋œ ์‚ฌ์šฉ์ž ์š”์ฒญ #4 ForkJoinPool-1-worker-8 ์Šค๋ ˆ๋“œ์—์„œ ์ฒ˜๋ฆฌ๋œ ์‚ฌ์šฉ์ž ์š”์ฒญ #7
ForkJoinPool-์—์„œ ์ฒ˜๋ฆฌ๋œ ์‚ฌ์šฉ์ž ์š”์ฒญ #1 1-worker-2 ์Šค๋ ˆ๋“œ
ForkJoinPool-1-worker-3 ์Šค๋ ˆ๋“œ์—์„œ ์ฒ˜๋ฆฌ๋œ ์‚ฌ์šฉ์ž ์š”์ฒญ #2
ForkJoinPool-1-worker-4 ์Šค๋ ˆ๋“œ์—์„œ
์ฒ˜๋ฆฌ๋œ ์‚ฌ์šฉ์ž ์š”์ฒญ #3 ForkJoinPool-1-worker-7 ์Šค๋ ˆ๋“œ์—์„œ ์ฒ˜๋ฆฌ๋œ ์‚ฌ์šฉ์ž ์š”์ฒญ #6
์ฒ˜๋ฆฌ๋œ ์‚ฌ์šฉ์ž ForkJoinPool-1-worker-1 ์Šค๋ ˆ๋“œ์—์„œ ์š”์ฒญ #0
ForkJoinPool-1-worker-6 ์Šค๋ ˆ๋“œ์—์„œ ์ฒ˜๋ฆฌ๋œ ์‚ฌ์šฉ์ž ์š”์ฒญ #5 ForkJoinPool-
1-worker-9 ์Šค๋ ˆ๋“œ์—์„œ ์ฒ˜๋ฆฌ๋œ ์‚ฌ์šฉ์ž ์š”์ฒญ #8

๋Œ€๊ธฐ์—ด์ด ํ˜•์„ฑ๋œ ํ›„ ์Šค๋ ˆ๋“œ๊ฐ€ ์‹คํ–‰์„ ์œ„ํ•ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ 10๊ฐœ์˜ ์Šค๋ ˆ๋“œ ํ’€์—์„œ 20๊ฐœ์˜ ์ž‘์—…์ด ์–ด๋–ป๊ฒŒ ๋ถ„์‚ฐ๋˜๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ForkJoinPool-1-worker-4 ์Šค๋ ˆ๋“œ์—์„œ ์ฒ˜๋ฆฌ๋œ ์‚ฌ์šฉ์ž
์š”์ฒญ #3 ForkJoinPool-1-worker-8 ์Šค๋ ˆ๋“œ์—์„œ
์ฒ˜๋ฆฌ๋œ ์‚ฌ์šฉ์ž ์š”์ฒญ #7 ForkJoinPool-1-worker-3 ์Šค๋ ˆ๋“œ์—์„œ ์ฒ˜๋ฆฌ๋œ ์‚ฌ์šฉ์ž ์š”์ฒญ #2
ForkJoinPool-์—์„œ ์ฒ˜๋ฆฌ๋œ ์‚ฌ์šฉ์ž ์š”์ฒญ #4 1-worker-5 ์Šค๋ ˆ๋“œ
ForkJoinPool-1-worker-2 ์Šค๋ ˆ๋“œ์—์„œ ์ฒ˜๋ฆฌ๋œ ์‚ฌ์šฉ์ž ์š”์ฒญ #1
ForkJoinPool-1-worker-6 ์Šค๋ ˆ๋“œ์—์„œ
์ฒ˜๋ฆฌ๋œ ์‚ฌ์šฉ์ž ์š”์ฒญ #5 ForkJoinPool-1-worker-9 ์Šค๋ ˆ๋“œ์—์„œ ์ฒ˜๋ฆฌ๋œ ์‚ฌ์šฉ์ž ์š”์ฒญ #8
์ฒ˜๋ฆฌ๋œ ์‚ฌ์šฉ์ž ForkJoinPool-1-worker-10 ์Šค๋ ˆ๋“œ์—์„œ ์š”์ฒญ #9
ForkJoinPool-1-worker-1 ์Šค๋ ˆ๋“œ์—์„œ ์ฒ˜๋ฆฌ๋œ ์‚ฌ์šฉ์ž ์š”์ฒญ #0
ForkJoinPool-1-worker-7 ์Šค๋ ˆ๋“œ์—์„œ ์ฒ˜๋ฆฌ๋œ ์‚ฌ์šฉ์ž ์š”์ฒญ #6
ForkJoinPool-1-์—์„œ ์ฒ˜๋ฆฌ๋œ ์‚ฌ์šฉ์ž ์š”์ฒญ #10 ์ž‘์—…์ž-9 ์Šค๋ ˆ๋“œ
ForkJoinPool-1-worker-1 ์Šค๋ ˆ๋“œ์—์„œ ์ฒ˜๋ฆฌ๋œ ์‚ฌ์šฉ์ž ์š”์ฒญ #12
ForkJoinPool-1-worker-8 ์Šค๋ ˆ๋“œ์—์„œ
์ฒ˜๋ฆฌ๋œ ์‚ฌ์šฉ์ž ์š”์ฒญ #13 ForkJoinPool-1-worker-6 ์Šค๋ ˆ๋“œ์—์„œ ์ฒ˜๋ฆฌ๋œ ์‚ฌ์šฉ์ž ์š”์ฒญ #11
ForkJoinPool-์—์„œ ์ฒ˜๋ฆฌ๋œ ์‚ฌ์šฉ์ž ์š”์ฒญ #15 1-worker-8 ์Šค๋ ˆ๋“œ
ForkJoinPool-1-worker-1 ์Šค๋ ˆ๋“œ์—์„œ ์ฒ˜๋ฆฌ๋œ ์‚ฌ์šฉ์ž ์š”์ฒญ #14
ForkJoinPool-1-worker-6 ์Šค๋ ˆ๋“œ์—์„œ
์ฒ˜๋ฆฌ๋œ ์‚ฌ์šฉ์ž ์š”์ฒญ #17 ForkJoinPool-1-worker-7 ์Šค๋ ˆ๋“œ์—์„œ ์ฒ˜๋ฆฌ๋œ ์‚ฌ์šฉ์ž ์š”์ฒญ #16
์ฒ˜๋ฆฌ๋œ ์‚ฌ์šฉ์ž ForkJoinPool-1-worker-6 ์Šค๋ ˆ๋“œ์˜ ์š”์ฒญ #19
ForkJoinPool-1-worker-1 ์Šค๋ ˆ๋“œ์˜ ์ฒ˜๋ฆฌ๋œ ์‚ฌ์šฉ์ž ์š”์ฒญ #18

์ถœ๋ ฅ์—์„œ ์ผ๋ถ€ ์Šค๋ ˆ๋“œ๋Š” ์—ฌ๋Ÿฌ ์ž‘์—…( ForkJoinPool-1-worker-6 ์™„๋ฃŒ 4 ์ž‘์—… ์™„๋ฃŒ)์„ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐ˜๋ฉด ์ผ๋ถ€ ์Šค๋ ˆ๋“œ๋Š” ํ•˜๋‚˜๋งŒ ์™„๋ฃŒ( ForkJoinPool-1-worker-2 )ํ•˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. call ๋ฉ”์„œ๋“œ ๊ตฌํ˜„์— 1์ดˆ ์ง€์—ฐ์ด ์ถ”๊ฐ€๋˜๋ฉด ๊ทธ๋ฆผ์ด ๋ฐ”๋€๋‹ˆ๋‹ค.


Callable<Void> callable = () -> {
   System.out.println("Processed user request #" + taskNumber + " on thread " + Thread.currentThread().getName());
   TimeUnit.SECONDS.sleep(1);
   return null;
};

์‹คํ—˜์„ ์œ„ํ•ด ๋‹ค๋ฅธ ์ปดํ“จํ„ฐ์—์„œ ๋™์ผํ•œ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ ์ถœ๋ ฅ:

ForkJoinPool-1-worker-23 ์Šค๋ ˆ๋“œ์—์„œ ์ฒ˜๋ฆฌ๋œ ์‚ฌ์šฉ์ž ์š”์ฒญ #2
ForkJoinPool-1-worker-31 ์Šค๋ ˆ๋“œ์—์„œ
์ฒ˜๋ฆฌ๋œ ์‚ฌ์šฉ์ž ์š”์ฒญ #7 ForkJoinPool-1-worker-27 ์Šค๋ ˆ๋“œ์—์„œ ์ฒ˜๋ฆฌ๋œ ์‚ฌ์šฉ์ž ์š”์ฒญ #4
ForkJoinPool-์—์„œ ์ฒ˜๋ฆฌ๋œ ์‚ฌ์šฉ์ž ์š”์ฒญ #5 1-worker-13 ์Šค๋ ˆ๋“œ
ForkJoinPool-1-worker-19 ์Šค๋ ˆ๋“œ์—์„œ ์ฒ˜๋ฆฌ๋œ ์‚ฌ์šฉ์ž ์š”์ฒญ #0
ForkJoinPool-1-worker-3 ์Šค๋ ˆ๋“œ์—์„œ
์ฒ˜๋ฆฌ๋œ ์‚ฌ์šฉ์ž ์š”์ฒญ #8 ForkJoinPool-1-worker-21 ์Šค๋ ˆ๋“œ์—์„œ ์ฒ˜๋ฆฌ๋œ ์‚ฌ์šฉ์ž ์š”์ฒญ #9
์ฒ˜๋ฆฌ๋œ ์‚ฌ์šฉ์ž ForkJoinPool-1-worker-17 ์Šค๋ ˆ๋“œ์—์„œ ์š”์ฒญ #6
ForkJoinPool-1-worker-9 ์Šค๋ ˆ๋“œ์—์„œ ์ฒ˜๋ฆฌ๋œ ์‚ฌ์šฉ์ž ์š”์ฒญ #3
ForkJoinPool-1-worker-5 ์Šค๋ ˆ๋“œ์—์„œ ์ฒ˜๋ฆฌ๋œ ์‚ฌ์šฉ์ž ์š”์ฒญ #1
ForkJoinPool-1-์—์„œ ์ฒ˜๋ฆฌ๋œ ์‚ฌ์šฉ์ž ์š”์ฒญ #12 ์ž‘์—…์ž-23 ์Šค๋ ˆ๋“œ
ForkJoinPool-1-worker-19 ์Šค๋ ˆ๋“œ์—์„œ ์ฒ˜๋ฆฌ๋œ ์‚ฌ์šฉ์ž ์š”์ฒญ #15
ForkJoinPool-1-worker-27 ์Šค๋ ˆ๋“œ์—์„œ
์ฒ˜๋ฆฌ๋œ ์‚ฌ์šฉ์ž ์š”์ฒญ #14 ForkJoinPool-1-worker-3 ์Šค๋ ˆ๋“œ์—์„œ ์ฒ˜๋ฆฌ๋œ ์‚ฌ์šฉ์ž ์š”์ฒญ #11
ForkJoinPool-์—์„œ ์ฒ˜๋ฆฌ๋œ ์‚ฌ์šฉ์ž ์š”์ฒญ #13 1-worker-13 ์Šค๋ ˆ๋“œ
ForkJoinPool-1-worker-31 ์Šค๋ ˆ๋“œ์—์„œ ์ฒ˜๋ฆฌ๋œ ์‚ฌ์šฉ์ž ์š”์ฒญ #10
ForkJoinPool-1-worker-5 ์Šค๋ ˆ๋“œ์—์„œ
์ฒ˜๋ฆฌ๋œ ์‚ฌ์šฉ์ž ์š”์ฒญ #18 ForkJoinPool-1-worker-9 ์Šค๋ ˆ๋“œ์—์„œ ์ฒ˜๋ฆฌ๋œ ์‚ฌ์šฉ์ž ์š”์ฒญ #16
์ฒ˜๋ฆฌ๋œ ์‚ฌ์šฉ์ž ForkJoinPool-1-worker-21 ์Šค๋ ˆ๋“œ์˜ ์š”์ฒญ #17
ForkJoinPool-1-worker-17 ์Šค๋ ˆ๋“œ์˜ ์ฒ˜๋ฆฌ๋œ ์‚ฌ์šฉ์ž ์š”์ฒญ #19

์ด ์ถœ๋ ฅ์—์„œ โ€‹โ€‹ํ’€์˜ ์Šค๋ ˆ๋“œ๋ฅผ "์š”์ฒญ"ํ•œ ๊ฒƒ์ด ์ฃผ๋ชฉํ•  ๋งŒํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ์ž‘์—…์ž ์Šค๋ ˆ๋“œ์˜ ์ด๋ฆ„์€ 1์—์„œ 10๊นŒ์ง€๊ฐ€ ์•„๋‹ˆ๋ผ ๋•Œ๋•Œ๋กœ 10๋ณด๋‹ค ๋†’์Šต๋‹ˆ๋‹ค. ๊ณ ์œ ํ•œ ์ด๋ฆ„์„ ๋ณด๋ฉด ์‹ค์ œ๋กœ 10๋ช…์˜ ์ผ๊พผ์ด ์žˆ์Œ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(3, 5, 9, 13, 17, 19, 21, 23, 27 ๋ฐ 31). ์™œ ์ด๋Ÿฐ ์ผ์ด ์ผ์–ด ๋‚ฌ๋Š”์ง€ ๋ฌป๋Š” ๊ฒƒ์ด ํ•ฉ๋ฆฌ์ ์ž…๋‹ˆ๊นŒ? ์ง„ํ–‰ ์ƒํ™ฉ์„ ์ดํ•ดํ•˜์ง€ ๋ชปํ•  ๋•Œ๋งˆ๋‹ค ๋””๋ฒ„๊ฑฐ๋ฅผ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค.

์ด๊ฒƒ์ด ์šฐ๋ฆฌ๊ฐ€ ํ•  ์ผ์ž…๋‹ˆ๋‹ค. ์บ์ŠคํŒ…ํ•˜์ž์ง‘ํ–‰์ž ์„œ๋น„์ŠคForkJoinPool ์— ๋Œ€ํ•œ ๊ฐ์ฒด :


final ForkJoinPool forkJoinPool = (ForkJoinPool) executorService;

invokeAll ๋ฉ”์„œ๋“œ ๋ฅผ ํ˜ธ์ถœํ•œ ํ›„ Evaluate Expression ์ž‘์—…์„ ์‚ฌ์šฉํ•˜์—ฌ ์ด ๊ฐœ์ฒด๋ฅผ ๊ฒ€์‚ฌํ•ฉ๋‹ˆ๋‹ค . ์ด๋ ‡๊ฒŒ ํ•˜๋ ค๋ฉด invokeAll ๋ฉ”์„œ๋“œ ๋’ค์— ๋นˆ sout๊ณผ ๊ฐ™์€ ๋ฌธ์„ ์ถ”๊ฐ€ํ•˜๊ณ  ์ค‘๋‹จ์ ์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

ํ’€์— 10๊ฐœ์˜ ์Šค๋ ˆ๋“œ๊ฐ€ ์žˆ์ง€๋งŒ ์ž‘์—…์ž ์Šค๋ ˆ๋“œ ๋ฐฐ์—ด์˜ ํฌ๊ธฐ๋Š” 32๊ฐœ์ž„์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด์ƒํ•˜์ง€๋งŒ ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค. ๊ณ„์† ํŒŒ์ž. ํ’€์„ ์ƒ์„ฑํ•  ๋•Œ ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ ์ˆ˜์ค€์„ 32 ์ด์ƒ, ์˜ˆ๋ฅผ ๋“ค์–ด 40์œผ๋กœ ์„ค์ •ํ•ด ๋ด…์‹œ๋‹ค.


ExecutorService executorService = Executors.newWorkStealingPool(40);

๋””๋ฒ„๊ฑฐ์—์„œ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.๋‹ค์‹œ forkJoinPool ๊ฐ์ฒด.

์ด์ œ ์ž‘์—…์ž ์Šค๋ ˆ๋“œ ๋ฐฐ์—ด์˜ ํฌ๊ธฐ๋Š” 128์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด JVM์˜ ๋‚ด๋ถ€ ์ตœ์ ํ™” ์ค‘ ํ•˜๋‚˜๋ผ๊ณ  ๊ฐ€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. JDK(openjdk-14)์˜ ์ฝ”๋“œ์—์„œ ์ฐพ์•„๋ด…์‹œ๋‹ค.

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

์šฐ๋ฆฌ ์˜ˆ์ œ์˜ ๋˜ ๋‹ค๋ฅธ ํฅ๋ฏธ๋กœ์šด ์ธก๋ฉด์€ invokeAll ๋ฉ”์„œ๋“œ ์˜ ์‚ฌ์šฉ์ž…๋‹ˆ๋‹ค . invokeAll ๋ฉ”์„œ๋“œ๊ฐ€ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ฑฐ๋‚˜ ๊ฐ ์ž‘์—…์˜ ๊ฒฐ๊ณผ๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ๋Š” ๊ฒฐ๊ณผ ๋ชฉ๋ก(์ด ๊ฒฝ์šฐ List <Future<Void>>)์„ ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์€ ์ฃผ๋ชฉํ•  ๊ฐ€์น˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค .


var results = executorService.invokeAll(tasks);
        for (Future<Void> result : results) {
            // Process the task's result
        }

์ด ํŠน๋ณ„ํ•œ ์ข…๋ฅ˜์˜ ์„œ๋น„์Šค ๋ฐ ์Šค๋ ˆ๋“œ ํ’€์€ ์˜ˆ์ธก ๊ฐ€๋Šฅํ•˜๊ฑฐ๋‚˜ ์ตœ์†Œํ•œ ์•”์‹œ์ ์ธ ์ˆ˜์ค€์˜ ๋™์‹œ์„ฑ์„ ๊ฐ€์ง„ ์ž‘์—…์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.