λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
Note for moment

[thread] mainμŠ€λ ˆλ“œ, λ‹€μ€‘μŠ€λ ˆλ“œ, μŠ€λ ˆλ“œλ™κΈ°ν™”

by πŸ’œautumn 2020. 9. 5.

* μŠ€λ ˆλ“œ

 : ν”„λ‘œκ·Έλž¨ λͺ…령을 μ‹€ν–‰ν•˜λŠ” μ΅œμ†Œλ‹¨μœ„

 : ν”„λ‘œκ·Έλž¨ μ‹€ν–‰μ‹œ λ”± ν•˜λ‚˜μ˜ μŠ€λ ˆλ“œ(mainμŠ€λ ˆλ“œ)만 생성

    ➑︎ ν”„λ‘œκ·Έλž¨μ‹€ν–‰ > JVM에 μ˜ν•΄ mainμŠ€λ ˆλ“œ μžλ™μƒμ„± > λͺ…λ Ή μˆ˜ν–‰ > mainλ©”μ†Œλ“œ μ’…λ£Œ > mainλ©”μ†Œλ“œ μžλ™μ†Œλ©Έ

 : μŠ€λ ˆλ“œ λ©”μ†Œλ“œ

   - Thread.currentThread() : ν˜„μž¬ λͺ…령을 μ‹€ν–‰ν•˜λŠ” μŠ€λ ˆλ“œμ˜ μΈμŠ€ν„΄μŠ€λ₯Ό λ°˜ν™˜

   - Thread.getName() : μŠ€λ ˆλ“œ μΈμŠ€ν„΄μŠ€μ— μ €μž₯된 μŠ€λ ˆλ“œλͺ…을 λ°˜ν™˜

 

* λ‹€μ€‘μŠ€λ ˆλ“œ

 : μ‹€μ œλ‘œ μŠ€λ ˆλ“œλŠ” mainμŠ€λ ˆλ“œ 단 ν•˜λ‚˜μ§€λ§Œ mainμŠ€λ ˆλ“œλŠ” μΈμŠ€ν„΄μŠ€λ₯Ό 생성할 수 μžˆμœΌλ―€λ‘œ μŠ€λ ˆλ“œ μ—¬λŸ¬κ°œ 생성가λŠ₯

    ➑︎ 단, ν•˜λ‚˜μ˜ μŠ€λ ˆλ“œ μΈμŠ€ν„΄μŠ€λŠ” ν•˜λ‚˜μ˜ μŠ€λ ˆλ“œλ§Œ μ‚¬μš© κ°€λŠ₯! 주의!!

 

* μŠ€λ ˆλ“œ 생성 방법

   λ°©λ²• 1) Thread 클래슀 상속받아 run() λ©”μ†Œλ“œ μ˜€λ²„λΌμ΄λ“œ 

              ➑︎ run() : μŠ€λ ˆλ“œκ°€ μ‹€ν–‰ν•  λͺ…령을 μ˜€λ²„λΌμ΄λ“œν•˜μ—¬ μž‘μ„±

              ➑︎ ν˜ΈμΆœμ‹œ μΈμŠ€ν„΄μŠ€λ₯Ό μƒμ„±ν•˜μ—¬ 호좜 : new μƒμ„±μŠ€λž˜λ“œν΄λž˜μŠ€λͺ….start();

   λ°©λ²• 2) Runnable μΈμŠ€ν„΄μŠ€ 상속받아 run() λ©”μ†Œλ“œ μ˜€λ²„λΌμ΄λ“œ

              ➑︎ run() : μŠ€λ ˆλ“œκ°€ μ‹€ν–‰ν•  λͺ…령을 μ˜€λ²„λΌμ΄λ“œν•˜μ—¬ μž‘μ„±

              ➑︎ ν˜ΈμΆœμ‹œ μƒμ„±μžλ‘œ 생성 ν›„ 호좜 : new Thread(new μƒμ„±μŠ€λž˜λ“œν΄λž˜μŠ€λͺ…)).start();

 

* Thread.sleep(ms)

 : μŠ€λ ˆλ“œμ˜ μ‹€ν–‰μ‹œκ°„μ„ μ›ν•˜λŠ” μ‹œκ°„λ§ŒνΌ μ§€μ—°μ‹œν‚€λŠ” λ©”μ†Œλ“œ

 : λ‹€μ€‘μŠ€λ ˆλ“œμ—μ„œ 같은 μ‹œκ°„μ„ μ§€μ—°μ‹œν‚¨λ‹€κ³ ν•΄μ„œ 각 μŠ€λ ˆλ“œκ°€ 맀번 같은 μˆœμ„œλ‘œ λ„λ‹¬ν•˜μ§€λŠ” μ•ŠλŠ”λ‹€. 

 

* Thread.setPriority(priority)

 : λ‹€μ€‘μŠ€λ ˆλ“œλ₯Ό κΌ­ μ›ν•˜λŠ” μˆœμ„œλŒ€λ‘œ μ‹€ν–‰ν•΄μ•Όν•˜λŠ” 경우 μ€‘μš”λ„λ₯Ό μ§€μ •ν•  수 μžˆλ‹€

 : priorityμ—λŠ” 0~10 κΉŒμ§€ κΈ°μž… κ°€λŠ₯ν•˜λ©°, κ°€μž₯ μ€‘μš”ν•œ 것은 10을 ν‘œν˜„ν•œλ‹€.

    ➑︎ μƒμˆ˜ν•„λ“œλ‘œλ„ κΈ°μž… κ°€λŠ₯ : .MIN_PRIORITY (0) .NORM_PRIORITY (5)  .MAX_PRIORITY (10)

 

 

* λ‹€μ€‘μŠ€λ ˆλ“œμ˜ 문제점 

λ§Œμ•½ λ‹€μ€‘μ˜ μŠ€λ ˆλ“œκ°€ λ™μ‹œμ— 같은(λ™μΌν•œ) λ©”μ†Œλ“œλ₯Ό ν˜ΈμΆœν•˜λŠ” 경우, 동일 속성에 λŒ€ν•œ λͺ…λ Ήμ²˜λ¦¬κ°€ λΆˆκ·œμΉ™ν•˜κΈ°μ— μˆœμ„œκ°€ μ—‰ν‚¬μˆ˜ 있음

이λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄ μŠ€λ ˆλ“œλ₯Ό 동기화 해주어야함

 

 "μŠ€λ ˆλ“œ 동기화"λž€? λ¨Όμ € λ©”μ†Œλ“œλ₯Ό μš”μ²­ν•œ μŠ€λ ˆλ“œκ°€ λͺ…령을 λ‹€ μˆ˜ν–‰ν• λ•ŒκΉŒμ§€ λ‹€λ₯Έ λͺ…령듀이 μž μ‹œ LOCK(쀑지)!

   μŠ€λ ˆλ“œ 동기화 방법 1) μŠ€λ ˆλ“œ μš”μ²­ λ©”μ†Œλ“œ μ„ μ–Έμ‹œ synchronized ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•˜μ—¬ μ„ μ–Έ

   μŠ€λ ˆλ“œ 동기화 방법 2) λ§Œμ•½, 배포된 클래슀 λ“±μ˜ 이유둜 λ©”μ†Œλ“œμ˜ μˆ˜μ •μ΄ λΆˆκ°€ν”Όν•œ 경우, 

                                    μŠ€λ ˆλ“œκ°€ λ©”μ†Œλ“œλ₯Ό μš”μ²­ν•  λ•Œ synchronized(λ©”μ†Œλ“œλͺ…) ν˜•νƒœλ‘œ μš”μ²­

 κ·Έ μ™Έ λ‹€μ€‘μŠ€λ ˆλ“œλ₯Ό μ‘°μž‘ν•˜κΈ° μœ„ν•΄ μ•„λž˜ 두 λ©”μ†Œλ“œλ„ 자주 μ‚¬μš©λœλ‹€

  - notify() : wait() λ©”μ†Œλ“œμ—μ˜ν•΄ μŠ€λ ˆλ“œμ˜ LOCK ν•΄μ œ

  - wait() : notify() λ©”μ†Œλ“œ ν˜ΈμΆœμ „κΉŒμ§€ μŠ€λ ˆλ“œ 쀑지(LOCK)

λŒ“κΈ€