ch25 : Thread

λͺ©μ°¨

λ©€ν‹° μŠ€λ ˆλ“œλ₯Ό μ‚¬μš©ν•˜λŠ” 이유

✏️ μŠ€λ ˆλ“œλŠ” ν”„λ‘œμ„ΈμŠ€μ™€ λ‹€λ₯΄κ²Œ, (같은 ν”„λ‘œμ„ΈμŠ€μ˜) μŠ€λ ˆλ“œλ“€λΌλ¦¬λŠ” λ©”λͺ¨λ¦¬λ₯Ό κ³΅μœ ν•˜κΈ°μ— 곡간 효율적이고 Context-Swithing이 λΉ λ₯΄λ‹€.

μ‹€ν–‰ 방법 - 메인 ν•¨μˆ˜μ— μ—¬λŸ¬ μŠ€λ ˆλ“œλ₯Ό μ‹œμž‘μ‹œμΌœμ£Όλ©΄ λœλ‹€.

Runnable μΈν„°νŽ˜μ΄μŠ€μ™€ Thread 클래슀

μŠ€λ ˆλ“œλ₯Ό μƒμ„±ν•˜λŠ” λ°©λ²•μ—λŠ” 두 κ°€μ§€κ°€ μžˆλ‹€.

  1. Runnable μΈν„°νŽ˜μ΄μŠ€

  2. Thread 클래슀 (Runnable μΈν„°νŽ˜μ΄μŠ€λ₯Ό 상속받은 클래슀. 즉, κ΅¬ν˜„ν•¨)

(λ‘˜λ‹€ java.lang에 μžˆμœΌλ―€λ‘œ import μ•ˆν•΄λ„ λœλ‹€.)

  • Runnable μΈν„°νŽ˜μ΄μŠ€μ—λŠ” void run() 만 μ„ μ–Έλ˜μ–΄ μžˆλ‹€. 이 λ©”μ†Œλ“œλŠ” μŠ€λ ˆλ“œκ°€ μ‹œμž‘λ˜λ©΄ μˆ˜ν–‰λ˜λŠ” λ©”μ†Œλ“œμ΄λ‹€. β†’ Thread ν΄λž˜μŠ€λŠ” ν•΄λ‹Ή λ©”μ†Œλ“œλ§Œ κ΅¬ν˜„ν•΄μ£Όλ©΄ λœλ‹€.

  • Thread 클래슀λ₯Ό ν™•μž₯ν•œ κ²½μš°κ°€ μ‚¬μš©μ΄ νŽΈλ¦¬ν•˜λ‹€.

  • 그럼 Runnable μΈν„°νŽ˜μ΄μŠ€λŠ” μ–Έμ œ μ‚¬μš©ν• κΉŒ? ν΄λž˜μŠ€λŠ” 닀쀑 상속이 λΆˆκ°€λŠ₯ν•˜λ‹€. λ‚΄κ°€ λ§Œλ“œλŠ” ν΄λž˜μŠ€κ°€ Thread 클래슀 외에도 λ‹€λ₯Έ 클래슀λ₯Ό 상속받아야 ν•˜λŠ” κ²½μš°μ—λŠ” Runnable μΈν„°νŽ˜μ΄μŠ€μ„ μƒμ†λ°›μœΌλ©΄ λœλ‹€.

μŠ€λ ˆλ“œ μ‹€ν–‰ 방식

  • μŠ€λ ˆλ“œκ°€ μˆ˜ν–‰λ˜λŠ” λ©”μ†Œλ“œλŠ” run()이닀. (그리고 이 λ©”μ†Œλ“œκ°€ μ’…λ£Œλ  λ•Œ μŠ€λ ˆλ“œκ°€ μ’…λ£Œλœλ‹€.)

  • μŠ€λ ˆλ“œλ₯Ό μ‹œμž‘ν•˜λŠ” λ©”μ†Œλ“œλŠ” start()이닀.

  • 두 κ°€μ§€ 방식은 μŠ€λ ˆλ“œλ₯Ό μ‹€ν–‰ν•˜λŠ” 방식이 λ‹€λ₯΄λ‹€.

  • Runnable μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•œ 클래슀의 μ˜ˆμ‹œ

    public class Test implements Runnable {
    
       public void run() {
    	   // κ΅¬ν˜„
       }
    }
    
    // Runnable μ‹€ν–‰
    RunnableSample runnable = new RunnableSample();
    new Therad(runnable).start(); 
  • Thread 클래슀λ₯Ό ν™•μž₯ν•œ 클래슀의 μ˜ˆμ‹œ

    public class Test extends Thread {
    
     @Override
     public void run() {
    	 // κ΅¬ν˜„
     }
    }
    
    // Thread μ‹€ν–‰
    ThreadSample thread = new ThreadSample();
    thread.start();  

μŠ€λ ˆλ“œμ˜ μ‹€ν–‰

  • start()λ₯Ό ν˜ΈμΆœν•˜λ©΄ run() λ©”μ„œλ“œ λ‚΄μš©μ΄ λλ‚˜λ“  말든 μ“°λ ˆλ“œλ₯Ό μ‹œμž‘ν•œ λ©”μ„œλ“œμ—μ„œ κ·Έ λ‹€μŒ 쀄이 μ‹€ν–‰λœλ‹€.

  • μ“°λ ˆλ“œ μ‹œμž‘ν•  λ•Œ 100 숫자λ₯Ό λ„˜κ²¨μ£Όκ³  μ‹Άλ‹€λ©΄? -> μ“°λ ˆλ“œλ₯Ό 상속받은 μƒμ„±μžμ— λ§€κ°œλ³€μˆ˜λ‘œ λ°›μœΌλ©΄ λœλ‹€.

μŠ€λ ˆλ“œμ˜ μ’…λ£Œ

  • sleep()

    • λ§€κ°œλ³€μˆ˜λ‘œ λ„˜μ–΄μ˜¨ μ‹œκ°„λ§ŒνΌ λŒ€κΈ°ν•œλ‹€.

    • μ‚¬μš©ν•  땐 항상 try-catch둜 λ¬Άμ–΄μ€€λ‹€. InterrptedException ν˜Ήμ€ μƒμœ„ μ˜ˆμ™Έ 클래슀둜 μ˜ˆμ™Έμ²˜λ¦¬ ν•΄μ£Όμ–΄μ•Ό ν•œλ‹€.

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

  • 일반 μŠ€λ ˆλ“œλŠ” JVM이 μ’…λ£Œν•  수 μ—†μœΌλ‚˜, 데λͺ¬ μŠ€λ ˆλ“œλŠ” JVM이 끝낼 수 μžˆλ‹€.

  • μŠ€λ ˆλ“œ μ‹€ν–‰(start())전에 데λͺ¬μŠ€λ ˆλ“œλ‘œ μ§€μ •λ˜μ–΄μ•Ό ν•œλ‹€.

    • μŠ€λ ˆλ“œκ°μ²΄.setDaemon(true); // 데λͺ¬μŠ€λ ˆλ“œ μ§€μ •

  • 데λͺ¬ μŠ€λ ˆλ“œλŠ” ν•΄λ‹Ή μŠ€λ ˆλ“œκ°€ μ’…λ£Œλ˜μ§€ μ•Šμ•„λ„, λ‹€λ₯Έ 싀행쀑인 μŠ€λ ˆλ“œκ°€ μ—†λ‹€λ©΄ μ’…λ£Œλœλ‹€.

  • ex) 뢀가적인 μž‘μ—…μ„ 데λͺ¬μŠ€λ ˆλ“œλ‘œ λ§Œλ“ λ‹€.

    • λͺ¨λ‹ˆν„°λ§ μŠ€λ ˆλ“œλ₯Ό 데λͺ¬μŠ€λ ˆλ“œλ‘œ λ§Œλ“€κ³ , 일반 μŠ€λ ˆλ“œκ°€ μ’…λ£Œλ˜λ©΄ μžλ™μœΌλ‘œ λͺ¨λ‹ˆν„°λ§ μŠ€λ ˆλ“œλ„ μ’…λ£Œμ‹œμΌœ ν”„λ‘œμ„ΈμŠ€λ₯Ό λλ‚΄λŠ” 경우

Last updated