[Java] μŠ€λ ˆλ“œν’€

μžλ°”λŠ” ν‘œμ€€ 라이브러리둜 μŠ€λ ˆλ“œν’€μ„ μ§€μ›ν•œλ‹€.
μŠ€λ ˆλ“œν’€μ€ κ³Όλ„ν•œ μŠ€λ ˆλ“œμ˜ 생성을 λ°©μ§€ν•˜κ³ , 미리 μŠ€λ ˆλ“œλ₯Ό μ μ ˆν•œ 수만큼 κ΄€λ¦¬ν•΄μ„œ μŠ€λ ˆλ”©μ˜ μ„±λŠ₯을 λ†’μ—¬μ£ΌλŠ” λ©‹μ§„ 녀석이닀. μŠ€λ ˆλ“œλ₯Ό λ‹€ 써도 죽이지 μ•Šκ³  μž¬ν™œμš©μ„ ν•œλ‹€.
단점은 μŠ€λ ˆλ“œκ°€ 계속 λŒκ³ μžˆλŠ”κ±°λΌ... λ‚­λΉ„κ°€ μ’€ μžˆμ„ μˆ˜λ„ μžˆλ‹€λŠ” 것이닀.

java.util.concurrent. νŒ¨ν‚€μ§€μ— λͺ¨μ—¬μžˆλ‹€.

μŠ€λ ˆλ“œν’€μ€ 기본적으둜 ExecutorService μΈν„°νŽ˜μ΄μŠ€λ‘œ κ΅¬ν˜„ν•˜λ„λ‘ λ˜μ–΄μžˆλŠ”λ°. 직접 λ§Œλ“€μ–΄μ“°κΈ΄ κ·Έλ ‡κ³ .
κ·Έλƒ₯ Excutors 클래슀의 μ •μ λ©”μ„œλ“œ newCachedThreadPool λ“±μœΌλ‘œ 생성할 수 μžˆλ‹€.
이건 μŠ€λ ˆλ“œ 수λ₯Ό μ•Œμ•„μ„œ 잘 κ΄€λ¦¬ν•΄μ£ΌλŠ”λ°,
직접 μŠ€λ ˆλ“œμ˜ 수λ₯Ό μ •ν•˜κ³  μ‹Άλ‹€λ©΄ newFixedThreadPool 등을 μ‚¬μš©ν•˜λ©΄ λœλ‹€.

그리고 μŠ€λ ˆλ“œν’€μ— μ‹€ν–‰ν•  ν•¨μˆ˜λ₯Ό λ³΄λ‚΄λŠ”κ±΄, submit, execute λ©”μ„œλ“œλ‘œ μˆ˜ν–‰ν•œλ‹€.
μ›¬λ§Œν•˜λ©΄ submit을 μ“°λŠ”κ²Œ μž¬ν™œμš©μ΄λ‚˜ μœ μ—°μ„± λ©΄μ—μ„œ μ’‹λ‹€.
그리고 이 λ©”μ„œλ“œλ“€μ€ Runnableμ΄λ‚˜ Callable μΈν„°νŽ˜μ΄μŠ€μ˜ 객체λ₯Ό λ°›μ•„μ„œ μŠ€λ ˆλ“œν’€μ— μ˜¬λ¦°λ‹€. Runnable은 μ‹€ν–‰λ§Œ ν•˜κ³ , Callable은 λ°˜ν™˜κ°’μ΄ μžˆλ‹€λŠ”κ²Œ λ‹€λ₯΄λ‹€.

μ•„λž˜ μ½”λ“œλŠ” Runnable 객체λ₯Ό 2개 κ΅¬ν˜„ν•΄μ„œ λ‚ λ¦°λ‹€.

그럼 뭐 μ λ‹Ήνžˆ μ„žμ—¬μ„œ λ™μ‹œμ— μˆ˜ν–‰λœλ‹€.


그럼 λ°˜ν™˜κ°’μ„ λ°›λŠ”κ±΄ μ–΄λ–»κ²Œ μ²˜λ¦¬ν• κΉŒ?
μƒκΈ°ν–ˆλ“―, Callable μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ‚¬μš©ν•˜λ©΄ λœλ‹€.
그리고 submit λ©”μ„œλ“œλŠ” λ°˜ν™˜κ°’μ΄λ‚˜ μŠ€λ ˆλ“œμ˜ μƒνƒœλ₯Ό 체크할 수 μžˆλŠ” Future μΈν„°νŽ˜μ΄μŠ€ 객체λ₯Ό λ°˜ν™˜ν•œλ‹€.
μ΄λ ‡κ²Œ μ‚¬μš©ν•œλ‹€. String을 λ°˜ν™˜κ°’μœΌλ‘œ λ°›μœΌλ‹ˆ Future인 것이닀.

그리고 λ°˜ν™˜κ°’μ€ Future μΈν„°νŽ˜μ΄μŠ€μ˜ get ν•¨μˆ˜λ‘œ κ°€μ Έμ˜¬ 수 μžˆλ‹€.
이건 μŠ€λ ˆλ“œμ˜ ν•¨μˆ˜κ°€ λλ‚˜κΈ°κΉŒμ§€ λΈ”λŸ­ν–ˆλ‹€κ°€, λλ‚˜λ©΄ 값을 λ°˜ν™˜ν•˜λŠ” ꡬ쑰λ₯Ό κ°€μ§„λ‹€.

그럼 뭐, 잘 λˆλ‹€.


μ°Έμ‘°
https://limkydev.tistory.com/55
https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ExecutorService.html
https://docs.oracle.com/javase/8/docs/api/index.html?java/util/concurrent/Future.html