Skip to content

Latest commit

ย 

History

History
138 lines (116 loc) ยท 6.97 KB

File metadata and controls

138 lines (116 loc) ยท 6.97 KB

ThreadPoolExecutor (java.util.concurrent)

  • java.util.concurrent ํŒจํ‚ค์ง€์—๋Š” ThreadPoolExecutor๋ผ๋Š” ์ด๋ฆ„์˜ ๋ฒ”์šฉ ์Šค๋ ˆ๋“œ ํ’€ ๊ตฌํ˜„์ฒด๊ฐ€ ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
  • ํ•ด๋‹น ํŒจํ‚ค์ง€ ์ด์ „์—๋Š” ๋ชจ๋“  ์„œ๋ธ”๋ฆฟ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ๋…์ž์ ์ธ ์Šค๋ ˆ๋“œ ํ’€์„ ๊ตฌํ˜„ํ•ด ์‚ฌ์šฉํ–ˆ์ง€๋งŒ,
    ํ˜„์žฌ ๋Œ€๋ถ€๋ถ„์˜ ๊ตฌํ˜„์ฒด๋Š” ThreadPoolExecutor ๊ตฌํ˜„์ฒด๋กœ ์Šค๋ ˆ๋“œ ํ’€ ๊ตฌํ˜„์„ ๊ต์ฒดํ•˜๊ฑฐ๋‚˜
    ์ตœ์†Œํ•œ ThreadPoolExecutor์™€ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋งž์ถ˜ ๊ตฌํ˜„์ฒด๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
  • ์ด ThreadPoolExecutor ์Šค๋ ˆ๋“œ ํ’€ ๊ตฌํ˜„์ฒด๊ฐ€ ๊ธฐ์กด์˜ ์Šค๋ ˆ๋“œ ํ’€์— ๋น„ํ•ด ์›”๋“ฑํ•œ ์„ฑ๋Šฅ์„ ๊ฐ€์กŒ๋‹ค๊ณ  ์ž…์ฆ๋˜์–ด ๊ทธ๋ ‡๋‹ค๊ธฐ๋ณด๋‹ค๋Š”
    ์–ธ์–ด ์ž์ฒด์—์„œ ์ œ๊ณตํ•˜๋Š” ํ‘œ์ค€ ๊ตฌํ˜„์ฒด๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์„œ๋ธ”๋ฆฟ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ์‚ฌ๋žŒ๋“ค ์‚ฌ์ด์—์„œ๋„
    ์ถ”๊ฐ€ ์ปค๋ฎค๋‹ˆ์ผ€์ด์…˜ ๋น„์šฉ์„ ์ค„์ผ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ฝ”๋“œ ์˜ˆ์ œ

  • ์•„๋ž˜ ์ฝ”๋“œ๋Š” 1๋ฒˆ๋ถ€ํ„ฐ 13๋ฒˆ๊นŒ์ง€ ์ฐจ๋ก€๋Œ€๋กœ ์ถœ๋ ฅ๋˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
public class WalkSerial {

    private Object lock = new Object();
    
    private void printMessage(int index) {
        synchronized (lock) {
            try {
                lock.wait(1000L);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.printf("%d๋ฒˆ์งธ MinGOOD ์ž…์žฅ\n", index);
        }
    }
    
    private void action(int size) {
        System.out.printf("%d๋ช…์˜ MinGOOD ๋ถ„์‹ ์ˆ \n", size);
        for (int i = 0; i < size; ++i) {
            printMessage(i+1);
        }
    }
    
    public static void main(String[] args) {
        WalkSerial ws = new WalkSerial();
        System.out.println("์ฐจ๋ก€๋Œ€๋กœ ์ถœ๋ ฅ๋˜๋Š” ์˜ˆ์ œ");
        ws.action(10);
    }
    
}
  • ์•„๋ž˜์ฝ”๋“œ๋Š” ThreadPoolExecutor ์˜ˆ์ œ์ž…๋‹ˆ๋‹ค.
package com.study.threadpool;

class People implements Runnable {
    private int index;
    private Object lock = new Object();
    
    public People(int index) {
        this.index = index;
    }
    
    @Override
    public void run() {
        synchronized (lock) {
            try {
                lock.wait(1000L);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.printf("%d๋ฒˆ์งธ MinGOOD ์ž…์žฅ\n", index);
        }
    }
}
package com.study.threadpool;

import java.util.concurrent.*;

public class WalkParallel {

    private void action(int size) {
        System.out.printf("%d๋ช…์˜ MinGOOdD ๋ถ„์‹ ์ˆ \n", size);
        
        ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(10, 20, 60, TimeUnit.SECONDS, new SynchronousQueue<Runnable>());
        for (int i = 0; i < size; ++i) {
            threadPoolExecutor.execute(new People(i + 1));
        }
        threadPoolExecutor.shutdown();
    }

    public static void main(String[] args) {
        WalkParallel wp = new WalkParallel();
        System.out.println("ThreadPoolExecutor ์˜ˆ์ œ");
        wp.action(10);
    }
    
}
  • ์ „์ฒด ์ˆ˜ํ–‰์€ 2์ดˆ ๋‚ด๋กœ ์ข…๋ฃŒ๋˜๋ฉฐ, ์ˆœ์„œ์— ์ƒ๊ด€์—†์ด ๋ฌด์ž‘์œ„๋กœ ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค.
  • ๋˜ํ•œ, ์Šค๋ ˆ๋“œ ํ’€์€ ๋‚ด๋ถ€์— ์š”์ฒญ์ด ๋“ค์–ด์™”์„ ๋•Œ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ๋Œ€๊ธฐ ์ƒํƒœ์˜ ์Šค๋ ˆ๋“œ๋ฅผ ๊ณ„์† ์œ ์ง€ํ•˜๋ฏ€๋กœ
    ํ˜„์žฌ ์ž‘์—… ํ๊ฐ€ ๋น„์—ˆ๋‹ค๊ณ  ์ž๋™์œผ๋กœ ์ข…๋ฃŒ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ์œ„ ์˜ˆ์ œ์—์„œ๋Š” shutdown ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•ด ์Šค๋ ˆ๋“œ ํ’€ ์ž์ฒด๋ฅผ ์ข…๋ฃŒ์‹œ์ผฐ์Šต๋‹ˆ๋‹ค.
  • ์„œ๋ธ”๋ฆฟ ์ปจํ…Œ์ด๋„ˆ๋Š” ThreadPoolExecutor์˜ LifeCycle์„ ์ ์ ˆํžˆ ๊ด€๋ฆฌํ•ด์ฃผ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

ThreadPoolExecutor ์‚ฌ์šฉ

  • ThreadPoolExecutor์˜ ์‚ฌ์šฉ์€ ๋น„๊ต์  ์ง๊ด€์ ์œผ๋กœ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋ณ‘๋ ฌ๋กœ ์ˆ˜ํ–‰ํ•  ์ž‘์—…์„ Runnable ํƒ€์ž…์œผ๋กœ ์ƒ์„ฑํ•ด ThreadPoolExecutor์˜ executor ๋ฉ”์†Œ๋“œ ์ธ์ž๋กœ ๋„˜๊ฒจ์ฃผ๊ธฐ๋งŒ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.
  • ์—ฌ๊ธฐ์„œ ์ฃผ์˜ํ•  ์ ์€ ์ž‘์—… ํ๋กœ ์‚ฌ์šฉํ•  BlockingQueue์˜ ์„ฑ์งˆ์— ๋”ฐ๋ผ ๋ฏธ๋ฌ˜ํ•˜๊ฒŒ 3๊ฐ€์ง€ ๋‹ค๋ฅธ ์ˆ˜ํ–‰ ๋ฐฉ์‹์ด ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์˜ˆ์ œ์—์„œ ์‚ฌ์šฉํ•œ SynchronousQueue๋Š” ์ˆ˜ํ–‰ ์š”์ฒญ์ด ๋“ค์–ด์˜ค๋ฉด

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

๋‚˜๋จธ์ง€ ๋‘ ๋ฐฉ์‹์€
์ตœ๋Œ€ ๊ฐ€๋Šฅ ์Šค๋ ˆ๋“œ ์ˆ˜์— ์ œํ•œ ์žˆ๋Š” ํ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ์‹๊ณผ ์ œํ•œ ์—†๋Š” ํ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.

  • ์ด ๋‘ ๋ฐฉ์‹์—๋Š” ์‹ค์งˆ์ ์œผ๋กœ ์ตœ๋Œ€ ๊ฐ€๋Šฅ ์Šค๋ ˆ๋“œ ์ˆ˜๋Š” ์˜๋ฏธ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.
  • ์™œ๋ƒํ•˜๋ฉด, ThreadPoolExecutor ์ƒ์„ฑ์ž์˜ ์ฒซ ๋ฒˆ์งธ ์ธ์ž์ธ corePoolSize ์ˆ˜๋งŒํผ๋งŒ ์Šค๋ ˆ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด ๋™์ž‘ํ•˜๋ฉฐ,
    ์ด์ƒ์˜ ์š”์ฒญ์ด ๋“ค์–ด์˜ค๋ฉด ์Šค๋ ˆ๋“œ์˜ ์ˆ˜๋ฅผ ๋Š˜๋ฆฌ๋Š” ๋Œ€์‹  ์ถ”๊ฐ€ ์š”์ฒญ์„ ์ž‘์—… ํ์— ์Œ“์•„ ๋†“๊ณ  ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
  • ์•ž์˜ ๊ฒฝ์šฐ์™€ ๊ฐ™์ด ์ฒ˜๋ฆฌ๋˜๋Š” ์†๋„๋ณด๋‹ค ์š”์ฒญ์ด ๋“ค์–ด์˜ค๋Š” ์†๋„๊ฐ€ ๋” ๋น ๋ฅผ ๊ฒฝ์šฐ
    ์ œํ•œ ์—†๋Š” ํ(LinkedBlockingQueue)๋Š” ํ์˜ ํฌ๊ธฐ๊ฐ€ ๋น„์ •์ƒ์ ์œผ๋กœ ์ปค์ง€๋Š” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋ฐ˜๋ฉด, ์ œํ•œ ์žˆ๋Š” ํ(ArrayBlockingQueue)๋Š” ๋ฏธ๋ฆฌ ์ •ํ•ด์ง„ ํ ์‚ฌ์ด์ฆˆ๋ฅผ ๋„˜๋Š” ์š”์ฒญ์„ ๋ชจ๋‘ ๋ฒ„๋ฆฝ๋‹ˆ๋‹ค.
  • ๋”ฐ๋ผ์„œ, ์ด ์„ธ ํƒ€์ž…์€ ๋ชจ๋‘ ์„œ๋กœ ๊ธฐ๋Šฅ ๋ฐ ์•ˆ์ •์„ฑ์— ๋Œ€ํ•œ Trade-Off๊ฐ€ ์žˆ์œผ๋ฉฐ,
    ์–ด๋–ค ํƒ€์ž…์ด ์–ธ์ œ๋‚˜ ์˜ณ์€ ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์‚ฌ์šฉ๋˜๋Š” ์ƒํ™ฉ์— ๋งž๊ฒŒ ์ ์ ˆํžˆ ์„ ํƒํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ ์ • ๋ณ‘๋ ฌ ์ง„ํ–‰ ์ˆ˜

  • ๋Œ€๋ถ€๋ถ„์˜ ์„œ๋ธ”๋ฆฟ ์ปจํ…Œ์ด๋„ˆ์—๋Š” ์„œ๋ธ”๋ฆฟ์„ ๋™์ž‘์‹œํ‚ค๋Š” ์Šค๋ ˆ๋“œ์˜ ์ˆซ์ž๋ฅผ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ฆ‰, ์„œ๋ธ”๋ฆฟ์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ์Šค๋ ˆ๋“œ ํ’€์ด ๋‚ด๋ถ€์ ์œผ๋กœ ์œ ์ง€ํ•˜๋Š” Walker ์Šค๋ ˆ๋“œ์˜ ์ˆซ์ž๋ฅผ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ
    ์ด ๊ฐ’์„ ์–ด๋–ป๊ฒŒ ์„ค์ •ํ•˜๋А๋ƒ์— ๋”ฐ๋ผ ์„œ๋ธ”๋ฆฟ ์ปจํ…Œ์ด๋„ˆ์˜ ์ „์ฒด ์ฒ˜๋ฆฌ๋Ÿ‰์ด ํฌ๊ฒŒ ์˜ํ–ฅ์„ ๋ฐ›์Šต๋‹ˆ๋‹ค.

์„ค์ •์น˜๋ฅผ ๊ตฌํ•˜๊ธฐ ์œ„ํ•ด ๊ณ ๋ คํ•ด์•ผ ํ•  ์‚ฌํ•ญ

  • ์ปดํ“จํ„ฐ์˜ ์—ฐ์‚ฐ ์ฒ˜๋ฆฌ๋Š” CPU๊ฐ€ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, CPU๊ฐ€ ๊ฐ€์ง„ core์˜ ์ˆ˜๋งŒํผ ๊ณ„์‚ฐ ์ž‘์—…์„ ๋™์‹œ์— ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ด ๋ง์€ ์„œ๋ธ”๋ฆฟ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ CPU ์ฝ”์–ด ์ˆ˜ ๋ฏธ๋งŒ์˜ ์Šค๋ ˆ๋“œ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด
    1๊ฐœ ์ด์ƒ์˜ CPU ์ฝ”์–ด๋Š” ์„œ๋ธ”๋ฆฟ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์‚ฌ์šฉํ•˜์ง€ ๋ชปํ•œ๋‹ค๋Š” ์˜๋ฏธ์ž…๋‹ˆ๋‹ค.
  • ๋”ฐ๋ผ์„œ ์ตœ๋Œ€ ์Šค๋ ˆ๋“œ ์ˆ˜ ์„ค์ •์€ CPU ์ฝ”์–ด ์ˆ˜๋ณด๋‹ค ์ž‘์ง€ ์•Š์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ๋˜ํ•œ, ๋ณ‘๋ ฌ ์ง„ํ–‰๋˜์–ด์•ผ ํ•˜๋Š” ์Šค๋ ˆ๋“œ์˜ ์ˆ˜๊ฐ€ CPU ์ฝ”์–ด ์ˆ˜๋ณด๋‹ค ํฐ ๊ฒฝ์šฐ,
    ๋ชจ๋“  ์Šค๋ ˆ๋“œ๊ฐ€ ๋™์‹œ์— CPU ์ฝ”์–ด๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜๋Š” ์—†์Šต๋‹ˆ๋‹ค.
  • ๋‹ค์‹œ ๋งํ•ด, ๋‹ค์ˆ˜์˜ ์Šค๋ ˆ๋“œ๊ฐ€ ์†Œ์ˆ˜์˜ CPU ์ฝ”์–ด๋ฅผ ์ด์šฉํ•˜๋ ค๋ฉด,
    ํŠน์ • ์‹œ๊ฐ„์—๋Š” ๋ฐ˜๋“œ์‹œ ํ•˜๋‚˜ ์ด์ƒ์˜ ์Šค๋ ˆ๋“œ๊ฐ€ CPU ์ฝ”์–ด๋ฅผ ์ ์œ ํ•˜์ง€ ์•Š๊ณ  ๋Œ€๊ธฐ ์ƒํƒœ์— ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.