πŸ’»

Java ν”„λ‘œκ·Έλž˜λ° - μŠ€λ ˆλ“œ(Thread) λ³Έλ¬Έ

KITRI/JAVA

Java ν”„λ‘œκ·Έλž˜λ° - μŠ€λ ˆλ“œ(Thread)

λ˜νš¨λ‹ˆ 2020. 5. 20. 14:32

 

https://docs.oracle.com/en/java/javase/14/docs/api/java.base/java/lang/Thread.html

 

Thread (Java SE 14 & JDK 14)

All Implemented Interfaces: Runnable Direct Known Subclasses: ForkJoinWorkerThread public class Thread extends Object implements Runnable A thread is a thread of execution in a program. The Java Virtual Machine allows an application to have multiple thread

docs.oracle.com

ν”„λ‘œμ„ΈμŠ€(Proccess)

: ν•˜λ‚˜μ˜ μ‘μš© ν”„λ‘œκ·Έλž¨μ„ λ§ν•˜κ³ , OS μ—μ„œ λ‘κ°œ μ΄μƒμ˜ ν”„λ‘œκ·Έλž¨μ΄ μ‹€ν–‰ν•˜λ©΄ λ©€ν‹° νƒœμŠ€ν‚Ή(Multitasking)이라 ν•œλ‹€.

(ν•˜λ‚˜μ˜ μ»΄ν“¨ν„°μ—μ„œ μ—¬λŸ¬ 개의 ν”„λ‘œκ·Έλž¨μ΄ λ™μ‹œμ— μ‹€ν–‰ν•˜λŠ” 것을 λ©€ν‹° ν”„λ‘œμ„ΈμŠ€)

- λ©€ν‹° ν”„λ‘œμ„ΈμŠ€λ“€μ€ μ„œλ‘œ 독립적이기 λ•Œλ¬Έμ— ν•˜λ‚˜μ˜ ν”„λ‘œμ„ΈμŠ€μ—μ„œ 였λ₯˜κ°€ λ°œμƒν•΄λ„ λ‹€λ₯Έ ν”„λ‘œμ„ΈμŠ€λ“€μ—κ²Œ 영ν–₯을 λ―ΈμΉ˜μ§€ μ•ŠλŠ”λ‹€.

 

μŠ€λ ˆλ“œ(Thread)

: ν”„λ‘œμ„ΈμŠ€ λ‚΄μ—μ„œ λ™μ‹œμ— μ‹€ν–‰λ˜λŠ” 독립적인 μ‹€ν–‰ λ‹¨μœ„λ₯Ό λ§ν•œλ‹€. (ν•˜λ‚˜μ˜ μž‘μ—…)

 λ©€ν‹° μŠ€λ ˆλ“œλŠ” ν•˜λ‚˜μ˜ ν”„λ‘œκ·Έλž¨μ—μ„œ λ™μ‹œμ— μ—¬λŸ¬κ°€μ§€ 일을 μˆ˜ν–‰ν•  수 μžˆλ„λ‘ ν•΄μ£ΌλŠ” 것이닀. (ν•˜λ‚˜ μ΄μƒμ˜ μž‘μ—…) 

- λ©€ν‹° μŠ€λ ˆλ“œλŠ” ν•˜λ‚˜μ˜ ν”„λ‘œμ„ΈμŠ€ 내뢀에 μƒμ„±λ˜μ–΄ μž‘μ—…μ˜ μˆ˜ν–‰μ— ν•„μš”ν•œ μžμ›λ“€μ„ κ³΅μœ ν•˜κΈ° λ•Œλ¬Έμ— ν•˜λ‚˜μ˜ μŠ€λ ˆλ“œκ°€ μ˜ˆμ™Έλ₯Ό λ°œμƒμ‹œν‚€λ©΄ λ‹€λ₯Έ μŠ€λ ˆλ“œμ—λ„ 영ν–₯을 미치게 λœλ‹€. 

 

μ‹œκ°„μ˜ νλ¦„λŒ€λ‘œ 순차적으둜 μ‹€ν–‰λ˜λŠ” 것은 λ‹¨μΌμŠ€λ ˆλ“œ, ν”„λ‘œκ·Έλž¨ λ‚΄λΆ€μ˜ λ©€ν‹° νƒœμŠ€ν‚Ήμ΄ λ©€ν‹° μŠ€λ ˆλ“œ.

 

 

 

 

 

λ©€ν‹°μŠ€λ ˆλ“œ(Multi Thread)

 

- ν•˜λ‚˜μ˜ ν”„λ‘œμ„ΈμŠ€λ₯Ό λ‹€μˆ˜μ˜ μŠ€λ ˆλ“œλ‘œ λ§Œλ“€μ–΄ μ‹€ν–‰ν•˜λŠ” 것이닀.

- ν•˜λ‚˜μ˜ ν”„λ‘œμ„ΈμŠ€ 내에 λ‹€μˆ˜μ˜ μ‹€ν–‰ λ‹¨μœ„λ“€μ΄ μ‘΄μž¬ν•˜μ—¬ μž‘μ—…μ˜ μˆ˜ν–‰μ— ν•„μš”ν•œ μžμ›λ“€μ„ κ³΅μœ ν•˜κΈ° λ•Œλ¬Έμ— μžμ›μ˜ 생성과 관리가 μ€‘λ³΅λ˜λŠ” 것을 쀄일 수 μžˆλ‹€. 

- μ‹±κΈ€ μŠ€λ ˆλ“œ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ—μ„œλŠ” 메인 μŠ€λ ˆλ“œκ°€ μ’…λ£Œν•˜λ©΄ ν”„λ‘œμ„ΈμŠ€κ°€ μ’…λ£Œλ˜μ§€λ§Œ, λ©€ν‹° μŠ€λ ˆλ“œ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ—μ„œλŠ” μ‹€ν–‰ 쀑인 μŠ€λ ˆλ“œκ°€ ν•˜λ‚˜λΌλ„ μžˆλ‹€λ©΄, ν”„λ‘œμ„ΈμŠ€λŠ” μ’…λ£Œλ˜μ§€ μ•ŠλŠ”λ‹€. 

 

 

 

 

 

예제 1) 

 

Run() 을 μž¬μ •μ˜ν•΄μ„œ μž‘μ—… μŠ€λ ˆλ“œκ°€ μ‹€ν–‰ν•  μ½”λ“œλ₯Ό μž‘μ„±ν•΄μ•Όν•œλ‹€. 

 

 

 

 

μž‘μ—… μŠ€λ ˆλ“œλŠ” μƒμ„±λ˜λŠ” μ¦‰μ‹œ μ‹€ν–‰λ˜λŠ” 것이 μ•„λ‹ˆλΌ, start() λ©”μ†Œλ“œλ₯Ό ν˜ΈμΆœν•΄μ•Όλ§Œ λΉ„λ‘œμ†Œ μ‹€ν–‰λœλ‹€. 

 

 

싀행해보면 μ‹€ν–‰ν•  λ•Œλ§ˆλ‹€ λ‹€λ₯΄κ²Œ κ²°κ³Όκ°€ λ‚˜μ˜€λŠ” 것을 λ³Ό 수 μžˆλ‹€. 이것은 순차적으둜 μ‹€ν–‰λ˜λŠ” 것이 μ•„λ‹ˆλΌ

μŠ€λ ˆλ“œ 처리λ₯Ό ν•΄μ€ŒμœΌλ‘œμ¨ λ™μ‹œμ— μ‹€ν–‰λ˜λŠ” 것을 μ•Œ 수 μžˆλ‹€. 

 

 

κ°μ²΄μ—μ„œ ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν• λ•Œμ—λŠ” 직접 ν˜ΈμΆœν•˜μ˜€μ§€λ§Œ μŠ€λ ˆλ“œμ—μ„œλŠ” start()λ₯Ό μ΄μš©ν•΄μ„œ μ‹€ν–‰ν•΄μ€€λ‹€. (μ‹œμŠ€ν…œν˜ΈμΆœ)

Q. 콜백 ν•¨μˆ˜μ— λŒ€ν•΄ μ•Œκ³  μžˆμŠ΅λ‹ˆκΉŒ? λ©΄μ ‘ 질문으둜 많이 λ‚˜μ˜¨λ‹€. 

 

 

 

 

 

예제 2) μŠ€λ ˆλ“œλ₯Ό μ΄μš©ν•΄μ„œ 숫자λ₯Ό μΉ΄μš΄νŒ…ν•˜λ©΄μ„œ μ‚¬μš©μž μž…λ ₯λ°›κΈ°

 

 

 

 

 

static이 μŠ€λ ˆλ“œμ—μ„œ μœ μš©ν•˜κ²Œ 쓰인닀. 객체 λ°œμƒ 없이 λ‹€λ₯Έ 클래슀끼리 데이터λ₯Ό κ³΅μœ ν•΄μ„œ μ“Έ 수 있기 λ•Œλ¬Έμ—.

λ©€ν‹° μŠ€λ ˆλ“œλ‘œ μ‹€ν–‰ν•˜λŠ” μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ κ°œλ°œν•˜λ €λ©΄ λ¨Όμ € λͺ‡ 개의 μž‘μ—…μ„ λ³‘λ ¬λ‘œ 싀행할지 κ²°μ •ν•˜κ³  각 μž‘μ—…λ³„λ‘œ μŠ€λ ˆλ“œλ₯Ό 생성해야 ν•œλ‹€.

 

 

예제 3) 

Runnable 은 μž‘μ—… μŠ€λ ˆλ“œκ°€ μ‹€ν–‰ν•  수 μžˆλŠ” μ½”λ“œλ₯Ό 가지고 μžˆλŠ” 객체라고 ν•΄μ„œ 뢙여진 이름이닀. μΈν„°νŽ˜μ΄μŠ€ νƒ€μž…μž‰κΈ° λ•Œλ¬Έμ— κ΅¬ν˜„ 객체λ₯Ό λ§Œλ“€μ–΄ λŒ€μž…ν•΄μ•Όν•œλ‹€. Runnableμ—λŠ” run()λ©”μ†Œλ“œ ν•˜λ‚˜κ°€ μ •μ˜λ˜μ–΄ μžˆλŠ”λ°, κ΅¬ν˜„ ν΄λž˜μŠ€λŠ” run()을 μž¬μ •μ˜ν•΄μ„œ μž‘μ—… μŠ€λ ˆλ“œκ°€ μ‹€ν–‰ν•  μ½”λ“œλ₯Ό μž‘μ„±ν•΄μ•Όν•œλ‹€. 

 

두 κ°œκ°€ λ²ˆκ°ˆμ•„κ°€λ©΄μ„œ λ™μ‹œμ— μž‘μ—…μ΄ λœλ‹€.  

 

 

 

 

 

 

 

 

 

예제 4) μ„Έκ°œμ˜ μŠ€λ ˆλ“œ

 

메인이 λλ‚˜λ„ 계속 μ‹€ν–‰

 

μŠ€λ ˆλ“œλŠ” 기본적으둜 λ…λ¦½μŠ€λ ˆλ“œ, κ·ΈλŸ¬λ‚˜ 메인이 λλ‚˜λ©΄ 같이 λλ‚΄μ•Όν•˜λŠ” κ²½μš°κ°€ μžˆλ‹€.(μ’…μ†μŠ€λ ˆλ“œ)

 

데λͺ¬ μŠ€λ ˆλ“œ

- μ£Ό μŠ€λ ˆλ“œμ˜ μž‘μ—…μ„ λ•λŠ” 보쑰적인 역할을 ν•˜λŠ” μŠ€λ ˆλ“œ

- μ£Ό μŠ€λ ˆλ“œκ°€ μ’…λ£Œλ˜λ©΄ 데λͺ¬ μŠ€λ ˆλ“œλŠ” κ°•μ œμ μœΌλ‘œ μžλ™ μ’…λ£Œ

ex_μ›Œλ“œν”„λ‘œμ„Έμ„œμ˜ μžλ™μ €μž₯, λ―Έλ””μ–΄ ν”Œλ ˆμ΄μ–΄μ˜ λ™μ˜μƒ 및 μŒμ•…μž¬μƒ, 가비지 컬렉터

 

  • 데λͺ¬ μŠ€λ ˆλ“œ μ„€μ •

- μ£Ό μŠ€λ ˆλ“œκ°€ 데λͺ¬μ΄ 될 μŠ€λ ˆλ“œμ˜ setDeamon(true)λ₯Ό 호좜

- λ°˜λ“œμ‹œ start()λ©”μ†Œλ“œ ν˜ΈμΆœμ „μ— setDeamon(true)λ₯Ό ν˜ΈμΆœν•΄μ•Όν•œλ‹€.

 

  • 데λͺ¬μŠ€λ ˆλ“œ 확인 방법

- isDaemon()λ©”μ†Œλ“œμ˜ 리턴 값을 쑰사

 

메인이 λλ‚˜λ©΄ 같이 끝남.

 

 

μ›Œλ“œλ₯Ό μž‘μ„±ν•˜λ‹€ 보면 κ³„μ†μ μœΌλ‘œ 버퍼에닀가 μž‘μ—…ν•˜λŠ” 것을 μ €μž₯ν•˜λ‹€κ°€ μ €μž₯λ²„νŠΌμ„ λˆ„λ₯΄λ©΄ λ²„νΌμ˜ λ‚΄μš©μ„ ν•˜λ“œμ›¨μ–΄λ‘œ μ €μž₯ν•˜κ³ , μ—‘μŠ€λ₯Ό ν΄λ¦­ν•˜λ©΄ μ§€μš°κΈ°.

 

예제 5)

 

 

 

예제 6) 

객체 λ°œμƒν•΄μ„œ run λ©”μ†Œλ“œν•˜λ©΄ λ‹¨μΌμŠ€λ ˆλ“œ

 

start()λ©”μ†Œλ“œλ₯Ό μ΄μš©ν•΄μ„œ λ©€ν‹°μŠ€λ ˆλ“œ μ‹œν‚€λ©΄ main이 λλ‚˜λ©΄ λλ‚˜λ²„λ¦°λ‹€. 

 

Thread join() λ©”μ†Œλ“œ : ν•œμͺ½μ—μ„œ 끝날 λ•Œ 가지 κΈ°λ‹€λ €μ€€λ‹€.

 

join을 μ΄μš©ν•΄μ„œ λ‹€λ₯Έ ν΄λž˜μŠ€κ°€ μ’…λ£Œν•  λ•ŒκΉŒμ§€ μŠ€λ ˆλ“œλŠ” μΌμ‹œ μ •μ§€ν•œλ‹€. 

 

 

 

λ™μ‹œμ„±(Concurrency) : ν•˜λ‚˜μ˜ μ½”μ–΄μ—μ„œ λ©€ν‹° μŠ€λ ˆλ“œκ°€ λ²ˆκ°ˆμ•„ κ°€λ©° μ‹€ν–‰ν•˜λŠ” 것

                           μ–΄λ–€ μˆœμ„œμ— μ˜ν•΄ λ™μ‹œμ„±μœΌλ‘œ μ‹€ν–‰ν•  것인가λ₯Ό κ²°μ •ν•˜λŠ” 것은 μŠ€μΌ€μ€„λ§(CPU)이라고 ν•œλ‹€.

병렬성(Parallelism) : λ©€ν‹° μ½”μ–΄μ—μ„œ λ©€ν‹° μž‘μ—…μ„ λ™μ‹œμ— μ‹€ν–‰ν•˜λŠ” 것

 

 


μŠ€λ ˆλ“œμ˜ μ•ˆμ „ν•œ μ’…λ£Œ(stopν”Œλž˜κ·Έ, interrupt())

 

- μŠ€λ ˆλ“œλŠ” μžμ‹ μ˜ run() λ©”μ†Œλ“œκ°€ λͺ¨λ‘ μ‹€ν–‰λ˜λ©΄ μžλ™μ μœΌλ‘œ μ’…λ£Œλœλ‹€.

- κ²½μš°μ— λ”°λΌμ„œλŠ” μ‹€ν–‰ 쀑인 μŠ€λ ˆλ“œλ₯Ό μ¦‰μ‹œ μ’…λ£Œν•  ν•„μš”κ°€ μžˆλ‹€.

      예) λ™μ˜μƒμ„ λκΉŒμ§€ λ³΄μ§€μ•Šκ³ , μ‚¬μš©μžκ°€ λ©ˆμΆ€μ„ μš”κ΅¬ν•˜λŠ” 경우

- κ·ΈλŸ΄λ•Œ, ThreadλŠ” μŠ€λ ˆλ“œλ₯Ό μ¦‰μ‹œ μ’…λ£Œμ‹œν‚€κΈ° μœ„ν•΄ stop()λ©”μ†Œλ“œλ₯Ό μ œκ³΅ν•œλ‹€.

- κ·ΈλŸ¬λ‚˜ stop() λ©”μ†Œλ“œλ‘œ μŠ€λ ˆλ“œλ₯Ό κ°‘μžκΈ° μ’…λ£Œν•˜κ²Œ 되면 μŠ€λ ˆλ“œκ°€ μ‚¬μš©μ€‘μ΄λ˜ μžμ›λ“€μ΄ λΆˆμ•ˆμ „ν•œ μƒνƒœλ‘œ 남겨지기 λ•Œλ¬Έμ— deprecatedλ˜μ–΄ μ‚¬μš©ν•˜μ§€ μ•ŠλŠ”λ‹€.

- λ”°λΌμ„œ stopν”Œλž˜κ·Έλ₯Ό μ΄μš©ν•˜κ±°λ‚˜ interrupt() λ©”μ†Œλ“œλ₯Ό μ΄μš©ν•˜μ—¬ 이λ₯Ό μ²˜λ¦¬ν•œλ‹€.

 

 

yield()

- λ‹€λ₯Έ μŠ€λ ˆλ“œμ—κ²Œ 싀행을 μ–‘λ³΄ν•˜κ³  μžμ‹ μ€ μ‹€ν–‰ λŒ€κΈ° μƒνƒœλ‘œ κ°€λŠ” 것

- λ¬΄μ˜λ―Έν•œ λ°˜λ³΅μ„ 진행할 λ•Œ μ‚¬μš©, 전체 ν”„λ‘œκ·Έλž¨ μ„±λŠ₯에 도움

- yield()λ₯Ό ν˜ΈμΆœν•œ μŠ€λ ˆλ“œλŠ” μ‹€ν–‰ λŒ€κΈ° μƒνƒœλ‘œ λŒμ•„κ°€κ³  λ™μΌν•œ μš°μ„ μˆœμœ„ λ˜λŠ” 높은 μš°μ„ μˆœμœ„λ₯Ό κ°–λŠ” λ‹€λ₯Έ μŠ€λ ˆλ“œκ°€ μ‹€ν–‰κΈ°νšŒλ₯Ό 가짐

 

 

μŠ€λ ˆλ“œ 곡유

- 데λͺ¬μŠ€λ ˆλ“œ, join, 동기화

​

Synchronized

- μŠ€λ ˆλ“œκ°€ μ‚¬μš© 쀑인 객체λ₯Ό λ‹€λ₯Έ μŠ€λ ˆλ“œκ°€ λ³€κ²½ν•  수 없도둝 ν•˜λ €λ©΄ μŠ€λ ˆλ“œ μž‘μ—…μ΄ 끝날 λ•Œ κΉŒμ§€ 객체에 μž κΈˆμ„ κ±Έμ–΄ λ‹€λ₯Έ μŠ€λ ˆλ“œκ°€ μ‚¬μš©ν•  수 없도둝 해야함

- μžλ°”λŠ” μž„κ³„μ˜μ—­μ„ μ§€μ •ν•˜κΈ° μœ„ν•΄ 동기화(Sychronized)λ©”μ†Œλ“œμ™€ 동기화 블둝을 제곡

- 단 ν•˜λ‚˜μ˜ μŠ€λ ˆλ“œλ§Œ μ‹€ν–‰ν•  수 μžˆλŠ” λ©”μ†Œλ“œ λ˜λŠ” 블둝을 λ§ν•œλ‹€.

- λ‹€λ₯Έ μŠ€λ ˆλ“œλŠ” λ©”μ†Œλ“œλ‚˜ 블둝이 싀행이 끝날 λ•Œ κΉŒμ§€ λŒ€κΈ°ν•΄μ•Ό ν•œλ‹€.

 

λ°˜μ‘ν˜•
Comments