λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
πŸ–₯️ λ°±μ—”λ“œ/Java

[ch.13] ν”„λ‘œμ„ΈμŠ€μ™€ μ“°λ ˆλ“œ

by OR15A 2023. 11. 15.

 ν”„λ‘œμ„ΈμŠ€μ™€ μ“°λ ˆλ“œ

  • ν”„λ‘œμ„ΈμŠ€: 싀행쀑인 ν”„λ‘œκ·Έλ ˜, OSλ‘œλΆ€ν„° λ©”λͺ¨λ¦¬λ₯Ό ν• λ‹Ήλ°›μŒ. μ“°λ ˆλ“œκ°€ μΌν•˜λŠ” μž‘μ—…ν™˜κ²½
  • μ“°λ ˆλ“œ: ν”„λ‘œμ„ΈμŠ€ μžμ›μ„ μ΄μš©ν•΄μ„œ μ‹€μ œλ‘œ μž‘μ—…μ„ μˆ˜ν–‰ν•˜λŠ” 것.
  • λ©€ν‹°μ“°λ ˆλ“œ: λ‘˜ μ΄μƒμ˜ μ“°λ ˆλ“œλ₯Ό 가진 ν”„λ‘œμ„ΈμŠ€
  • λ©€ν‹°μ“°λ ˆλ”©
  • μž₯점
    • β‘  CPU μ‚¬μš©λ₯  ν–₯상
    • β‘‘ μžμ› 효율적 μ‚¬μš©
    • β‘’ μ‚¬μš©μžμ— λŒ€ν•œ 응닡성 ν–₯상
    • β‘£ 직접뢄리 = μ½”λ“œ κ°„κ²°
  • *고렀사항: μžμ›μ„ κ³΅μœ ν•˜μ—¬ μž‘μ—…ν•˜λ©° μƒκΈ°λŠ” 동기화, κ΅μ°©μƒνƒœ 등을 κ³ λ €ν•  것

 

μ“°λ ˆλ“œμ˜ κ΅¬ν˜„

  • Thread 클래슀λ₯Ό μƒμ†ν•˜κ±°λ‚˜, Runnable μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•΄μ„œ run( )λ©”μ„œλ“œμ˜ λͺΈν†΅{ }을 μ±„μš°λŠ” 것.
  • μ§€κΈˆκΉŒμ§€ ν•œ 클래슀의 mainλ©”μ„œλ“œμ—  μ“°λ˜ λ‚΄μš©μ„ run( )λ©”μ„œλ“œμ˜ κ΅¬ν˜„λΆ€μ—μž‘μ„±ν•˜λ©΄ λ˜λŠ” κ²ƒμž„.
  • Runnable μΈν„°νŽ˜μ΄μŠ€: 였직 run()만 μ •μ˜λ˜μ–΄μžˆλŠ” κ°„λ‹¨ν•œ μΈν„°νŽ˜μ΄μŠ€.

 

 mainμ“°λ ˆλ“œμ—μ„œ start( )λ₯Ό ν˜ΈμΆœν–ˆμ„ λ•Œ

  • β‘ start( )κ°€ 호좜 μŠ€νƒμ„ μƒˆλ‘œ 생성함.
  • β‘‘μƒˆ 호좜 μŠ€νƒμ— run( )을 ν˜ΈμΆœν•¨. 이제 호좜 μŠ€νƒ 2κ°œκ°€ λ²ˆκ°ˆμ•„ κ°€λ©° μž‘μ—…μ„ μˆ˜ν–‰ν•¨.(OSμŠ€μΌ€μ₯΄λŸ¬μ˜ λ§ˆμŒμ— 따라)
  • λͺ¨λ“  μ“°λ ˆλ“œλŠ” 독립적인 μž‘μ—…μˆ˜ν–‰μ„ μœ„ν•΄μ„œ μžμ‹ λ§Œμ˜ ν˜ΈμΆœμŠ€νƒμ„ ν•„μš”λ‘œ 함. μƒˆλ‘œμš΄ μ“°λ ˆλ“œλ₯Ό μƒμ„±ν•˜κ³  μ‹€ν–‰μ‹œν‚¬ λ•Œλ§ˆλ‹€ [μƒˆλ‘œμš΄ 호좜 μŠ€νƒμ„ 생성 → μ“°λ ˆλ“œ μ’…λ£Œλ˜λ©΄ ν˜ΈμΆœμŠ€νƒ μ†Œλ©Έ] λ°˜λ³΅ν•¨.
  • mainλ©”μ„œλ“œμ˜ μž‘μ—…μ„ μˆ˜ν–‰ν•˜λŠ” 것: mainμ“°λ ˆλ“œ
  • μ‹€ν–‰ 쀑인 μ‚¬μš©μž μ“°λ ˆλ“œκ°€ ν•˜λ‚˜λ„ 없을 λ•Œ ν”„λ‘œκ·Έλž¨μ€ μ’…λ£Œλ¨.
  • ν•œ μ“°λ ˆλ“œκ°€ μ˜ˆμ™Έκ°€ λ°œμƒλ˜μ–΄ μ’…λ£Œλ˜μ–΄λ„, λ‹€λ₯Έ μ“°λ ˆλ“œμ˜ μ‹€ν–‰μ—λŠ” 영ν–₯을 λ―ΈμΉ˜μ§€ μ•ŠμŒ.

 

 μ‹±κΈ€μ“°λ ˆλ“œμ™€ λ©€ν‹°μ“°λ ˆλ“œ

  • μ»¨ν…μŠ€νŠΈ μŠ€μœ„μΉ­: ν”„λ‘œμ„ΈμŠ€ λ˜λŠ” μ“°λ ˆλ“œ κ°„μ˜ μž‘μ—… μ „ν™˜. μ •λ³΄μ˜ μ €μž₯/읽기에 μ‹œκ°„ μ†Œμš”λ¨.
  • 두 μ“°λ ˆλ“œκ°€ μ„œλ‘œ λ‹€λ₯Έ μžμ› μ‚¬μš© μ‹œ λ©€ν‹° μ“°λ ˆλ“œ ν”„λ‘œμ„ΈμŠ€κ°€ 더 νš¨μœ¨μ μž„. λ§Œμ•½ 두 μ“°λ ˆλ“œκ°€ μ„œλ‘œ λ‹€λ₯Έ μž‘μ—…μ„ μ‚¬μš©ν•  λ•Œ I/O블락킹이 일어날 수 있음.
  • I/Oμž‘μ—…μ΄ 수반될 λ•Œ λ©€ν‹°μ“°λ ˆλ“œ ν”„λ‘œμ„ΈμŠ€λΌλ©΄ μž…λ ₯을 κΈ°λ‹€λ¦¬λŠ” λΆ€λΆ„μ—μ„œ μ“°λ ˆλ“œλŠ” 기닀리지 μ•Šκ³  λ‹€λ₯Έ μ“°λ ˆλ“œ μž‘μ—…μ„ μˆ˜ν–‰ν•¨(Non-블락킹)

 

 μ“°λ ˆλ“œμ˜ μš°μ„ μˆœμœ„ (횟수, μ‹œκ°„)

  • μ“°λ ˆλ“œμ˜ μƒμˆ˜: public static final int NORM, MIN, MAX_PRIORITY
  • μ“°λ ˆλ“œμ˜ λ©”μ„œλ“œ: void setPriority(int newPriority) μ“°λ ˆλ“œμ˜ μš°μ„ μˆœμœ„λ₯Ό μ§€μ •ν•œ κ°’μœΌλ‘œ 변경함.
  • int getPriority( ): μ“°λ ˆλ“œμ˜ μš°μ„ μˆœμœ„ λ°˜ν™˜.
  • μš°μ„ μˆœμœ„ μ°¨λ“± 사싀 별 효과 μ—†μŒ
  • μ“°λ ˆλ“œμ˜ μš°μ„ μˆœμœ„: μž‘μ—…μ— μš°μ„ μˆœμœ„λ₯Ό 두어 PriorityQueue에 μ €μž₯ν•˜κ³  μš°μ„ μˆœμœ„ 높은 μž‘μ—…μ„ λ¨Όμ € μ²˜λ¦¬λ˜λ„λ‘ ν•˜κΈ°.

 

 μ“°λ ˆλ“œ κ·Έλ£Ή

  • μ„œλ‘œ κ΄€λ ¨λœ μ“°λ ˆλ“œλ₯Ό 그룹으둜 닀루기 μœ„ν•œ 것.
  • μ“°λ ˆλ“œ κ·Έλ£Ή 생성=μ“°λ ˆλ“œλ₯Ό λ¬Άμ–΄μ„œ 관리할 수 μžˆλŠ” 것.
  • λ³΄μ•ˆμƒμ˜ 이유둜 λ„μž…λ¨.
  • μžμ‹ μ΄ μ†ν•œ μ“°λ ˆλ“œ κ·Έλ£Ήκ³Ό ν•˜μœ„ μ“°λ ˆλ“œ 그룹은 λ³€κ²½ κ°€λŠ₯함O
  • λ‹€λ₯Έ μ“°λ ˆλ“œ 그룹의 μ“°λ ˆλ“œ 변경은 X
  • μ“°λ ˆλ“œ κ·Έλ£Ή μƒμ„±μž
    • ThreadGroup(이름), 
    • ThreadGroup(μ§€μ •λœ κ·Έλ£Ή 이름, μƒˆλ‘œ λ§Œλ“€ 이름)
  • μ“°λ ˆλ“œ κ·Έλ£Ή λ©”μ„œλ“œ
    • activeCount( ), checkAccess( ), destory( ), enumerate( ), getMaxPriority( ), getName( ), getParent( ), interrupt( ), isDaemon( ), isDestroyed( ), list( ), parentOf( ), setDaemon( ), setMaxPriority( )
  • μ“°λ ˆλ“œλ₯Ό μ“°λ ˆλ“œ 그룹에 ν¬ν•¨μ‹œν‚€λ €λ©΄ Threadμƒμ„±μžλ₯Ό μ΄μš©ν•΄μ•Όν•¨. μžλ°”μ˜μ •μ„ p.741ν•˜λ‹¨ 4가지방법 있음.
  • λͺ¨λ“  μ“°λ ˆλ“œ 그룹은 mainμ“°λ ˆλ“œ 그룹의 ν•˜μœ„ μ“°λ ˆλ“œκ·Έλ£Ή.
  • μ“°λ ˆλ“œ 그룹을 μ§€μ •ν•˜μ§€ μ•Šκ³  μƒμ„±ν•œ μ“°λ ˆλ“œλŠ” μžλ™μ μœΌλ‘œ mainμ“°λ ˆλ“œ κ·Έλ£Ήμž„.
  • Thread의 μ“°λ ˆλ“œ κ·Έλ£Ή κ΄€λ ¨ λ©”μ„œλ“œ
    • ThreadGroup getThreadGroup( ): μ“°λ ˆλ“œ μžμ‹ μ΄ μ†ν•œ μ“°λ ˆλ“œ 그룹을 λ°˜ν™˜ν•¨.
    • void uncaughException(Thread t, Throwable e): μ“°λ ˆλ“œ 그룹의 μ“°λ ˆλ“œκ°€ μ²˜λ¦¬λ˜μ§€ μ•Šμ€ μ˜ˆμ™Έμ— μ˜ν•΄ μ‹€ν–‰μ’…λ£Œλμ„ λ•Œ, JVM에 μ˜ν•΄ 이 λ©”μ„œλ“œκ°€ μžλ™μ μœΌλ‘œ 호좜됨.

 

 λ°λͺ¬ μ“°λ ˆλ“œ

  • λ‹€λ₯Έ μΌλ°˜μ“°λ ˆλ“œμ˜ μž‘μ—…μ„ λ•λŠ” 보쑰적인 역할을 μˆ˜ν–‰ν•˜λŠ” μ“°λ ˆλ“œ.
  • μΌλ°˜μ“°λ ˆλ“œκ°€ λͺ¨λ‘ μ’…λ£Œ μ‹œ κ°•μ œμ μœΌλ‘œ μžλ™ μ’…λ£Œλ¨.
  • μ˜ˆμ‹œ: 가비지컬렉터, μžλ™μ €μž₯, ν™”λ©΄κ°±μ‹ 
  • β‘ λ¬΄ν•œλ£¨ν”„&쑰건문으둜 μ‹€ν–‰ ν›„ λŒ€κΈ°
  • β‘‘νŠΉμ • 쑰건이 만쑱되면 μž‘μ—… μˆ˜ν–‰ → λ‹€μ‹œ λŒ€κΈ°

 

데λͺ¬ μ“°λ ˆλ“œ μž‘μ„± & 싀행방법

  • β‘ μ“°λ ˆλ“œ 생성
  • β‘‘setDaemon(true)호좜
  • β‘’μ“°λ ˆλ“œ μ‹€ν–‰

  • 데λͺ¬ μ“°λ ˆλ“œκ°€ μƒμ„±ν•œ μ“°λ ˆλ“œ = μžλ™μ μœΌλ‘œ 데λͺ¬μ“°λ ˆλ“œ
  • boolean isDeamon( ): 데λͺ¬μ“°λ ˆλ“œμΈμ§€ 확인함. λ°λͺ¬μ“°λ ˆλ“œκ°€ 맞으면 true
  • void setDeamon(boolean on) : 데λͺ¬μ“°λ ˆλ“œ ↔ μ‚¬μš©μž μ“°λ ˆλ“œ κ°„μ˜ λ³€κ²½ (λ§€κ°œλ³€μˆ˜λ₯Ό trueλ‘œν•˜λ©΄ 데λͺ¬μ“°λ ˆλ“œ 됨)
  • getAllStackTraces( ): 싀행쀑, λŒ€κΈ°μƒνƒœ, μž‘μ—…μ΄ μ™„λ£Œλ˜μ§€ μ•Šμ€ λͺ¨λ“  μ“°λ ˆλ“œμ˜ ν˜ΈμΆœμŠ€νƒμ„ 좜λ ₯ν•˜λŠ” λ©”μ„œλ“œ