Item 80. ExecutorService

μŠ€λ ˆλ“œλ³΄λ‹€λŠ” μ‹€ν–‰μž, ν…ŒμŠ€ν¬, μŠ€νŠΈλ¦Όμ„ μ• μš©ν•˜λΌ

μŠ€λ ˆλ“œλ₯Ό 직접 닀루기 μœ„ν•΄μ„œλŠ” μ˜ˆμ™Έλ₯Ό μœ„ν•œ μ½”λ“œλ„ 많이 μž‘μ„±ν•΄μ•Όν•˜κ³ , 였λ₯˜κ°€ λ°œμƒν•˜κΈ°λ„ 쉽닀. ν•˜μ§€λ§Œ java.util.concurrent νŒ¨ν‚€μ§€κ°€ λ‚˜μ˜€λ©΄μ„œ μŠ€λ ˆλ“œλ₯Ό 직접 닀루지 μ•Šκ³  μ‰½κ²Œ μž‘μ—…μ„ μ²˜λ¦¬ν•  수 있게 λ˜μ—ˆλ‹€.

public static void main(String[] args) {
    // μž‘μ—… 큐 생성(μ‹±κΈ€ μŠ€λ ˆλ“œλ‘œ λ™μž‘)
    ExecutorService exec = Executors.newSingleThreadExecutor();
    // μ‹±ν–‰ν•  ν…ŒμŠ€ν¬ λ„˜κΉ€
    exec.execute(runnable);
    // μ‹€ν–‰μž μ’…λ£Œ
    exec.shutdown();
}

μœ„ μ½”λ“œλŠ” ExecutorServiceλ₯Ό μ‚¬μš©ν•˜μ—¬ μŠ€λ ˆλ“œλ₯Ό μƒμ„±ν•˜κ³  μ‹€ν–‰ν•˜λŠ” κ°„λ‹¨ν•œ κΈ°λŠ₯을 μ‚¬μš©ν•œ μ½”λ“œμ΄λ‹€. κ·Έ 외에 μ•„λž˜ κΈ°λŠ₯을 μ œκ³΅ν•΄μ£Όκ³  μžˆλ‹€.

  • get: νŠΉμ • ν…ŒμŠ€ν¬ μ™„λ£Œ λŒ€κΈ°

  • invokeAny: ν…ŒμŠ€ν¬ λͺ¨μŒ 쀑 μ•„λ¬΄κ±°λ‚˜ ν•˜λ‚˜ μ™„λ£Œ λŒ€κΈ°

  • invokeAll: ν…ŒμŠ€ν¬ λͺ¨μŒ λͺ¨λ‘ μ™„λ£Œ λŒ€κΈ°

  • awaitTermination: μ‹€ν–‰μž μ„œλΉ„μŠ€ μ’…λ£Œ λŒ€κΈ°

λ˜ν•œ, μœ„ μ½”λ“œλŠ” μ‹±κΈ€ μŠ€λ ˆλ“œλ‘œ λ™μž‘ν•˜λŠ” ExecutorServiceλ₯Ό μƒμ„±ν–ˆμ§€λ§Œ, λ‹€λ₯Έ 정적 νŒ©ν„°λ¦¬ λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•˜μ—¬ λ‹€μ–‘ν•œ μŠ€λ ˆλ“œ 풀을 생성할 수 μžˆλ‹€.

  • Executors.newSingleThreadExecutor: 단일 μŠ€λ ˆλ“œ ν’€

  • Executors.newFixedThreadPool: κ³ μ • 크기 μŠ€λ ˆλ“œ ν’€

  • Executors.newCachedThreadPool: μΊμ‹œ μŠ€λ ˆλ“œ ν’€, κ°€λ²Όμš΄ μ„œλ²„λ‚˜ ν”„λ‘œν† νƒ€μž… μ„œλ²„μ— 적합(무거운 ν”„λ‘œλ•μ…˜ μ„œλ²„μ—λŠ” μ‚¬μš©ν•˜μ§€ μ•ŠλŠ” 것이 μ’‹μŒ)

    • μš”μ²­ 받은 ν…ŒμŠ€ν¬λ“€μ΄ 큐에 μŒ“μ΄μ§€ μ•Šκ³  μ¦‰μ‹œ μŠ€λ ˆλ“œμ— μœ„μž„λΌ μ‹€ν–‰λ˜κΈ° λ•Œλ¬Έμ— κ°€μš© μŠ€λ ˆλ“œκ°€ μ—†λŠ” 경우 μƒˆλ‘œμš΄ μŠ€λ ˆλ“œλ₯Ό μƒμ„±ν•˜κΈ° λ•Œλ¬Έμ— λ¬΄ν•œμ • μŠ€λ ˆλ“œλ₯Ό 생성할 수 있음

    • ν”„λ‘œλ•μ…˜ μ„œλ²„μ—μ„œλŠ” newFixedThreadPool을 μ‚¬μš©ν•˜κ±°λ‚˜, ThreadPoolExecutorλ₯Ό 직접 μ‚¬μš©ν•˜λŠ” 것이 μ’‹μŒ

Last updated