# μ“°λ ˆλ“œ(Thread)

written by sohyeon, hyemin πŸ’‘


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

ν”„λ‘œμ„ΈμŠ€(process)λž€ μ‹€ν–‰ 쀑인 ν”„λ‘œκ·Έλž¨(program)이닀.
ν”„λ‘œκ·Έλž¨μ„ μ‹€ν–‰ν•˜λ©΄ OSλ‘œλΆ€ν„° 싀행에 ν•„μš”ν•œ μžμ›(λ©”λͺ¨λ¦¬)을 ν• λ‹Ήλ°›μ•„ ν”„λ‘œμ„ΈμŠ€κ°€ λœλ‹€.

μ“°λ ˆλ“œλŠ” ν”„λ‘œμ„ΈμŠ€μ˜ μžμ›μ„ μ΄μš©ν•΄μ„œ μ‹€μ œλ‘œ μž‘μ—…μ„ μˆ˜ν–‰ν•˜λŠ” 것을 λ§ν•œλ‹€.
λͺ¨λ“  ν”„λ‘œμ„ΈμŠ€λŠ” μ΅œμ†Œν•œ ν•˜λ‚˜ μ΄μƒμ˜ μ“°λ ˆλ“œκ°€ μ‘΄μž¬ν•œλ‹€.

μ“°λ ˆλ“œκ°€ μž‘μ—…μ„ μˆ˜ν–‰ν•˜λŠ”λ° κ°œλ³„μ μΈ λ©”λͺ¨λ¦¬ 곡간(ν˜ΈμΆœμŠ€νƒ)을 ν•„μš”λ‘œ ν•˜κΈ° λ•Œλ¬Έμ— ν”„λ‘œμ„ΈμŠ€μ˜ λ©”λͺ¨λ¦¬ ν•œκ³„μ— 따라 생성할 수 μžˆλŠ” μ“°λ ˆλ“œμ˜ μˆ˜κ°€ κ²°μ •λœλ‹€.

# λ©€ν‹°νƒœμŠ€ν‚Ήκ³Ό λ©€ν‹°μ“°λ ˆλ”©

λ©€ν‹°νƒœμŠ€ν‚Ή(multi-tasking) : μ—¬λŸ¬ 개의 ν”„λ‘œμ„ΈμŠ€κ°€ λ™μ‹œμ— 싀행될 수 μžˆλ‹€.
λ©€ν‹°μ“°λ ˆλ”©(multi-threading) : ν•˜λ‚˜μ˜ ν”„λ‘œμ„ΈμŠ€ λ‚΄μ—μ„œ μ—¬λŸ¬ μ“°λ ˆλ“œκ°€ λ™μ‹œμ— μž‘μ—…μ„ μˆ˜ν–‰ν•˜λŠ” 것이닀.

CPU의 μ½”μ–΄κ°€ ν•œ λ²ˆμ— 단 ν•˜λ‚˜μ˜ μž‘μ—…λ§Œ μˆ˜ν–‰ν•  수 μžˆμœΌλ―€λ‘œ, μ‹€μ œλ‘œ λ™μ‹œμ— μ²˜λ¦¬ν•΄μ•Όν•˜λŠ” μ“°λ ˆλ“œμ˜ μˆ˜λŠ” μ½”μ–΄μ˜ κ°œμˆ˜μ™€ μΌμΉ˜ν•œλ‹€.

ν•˜μ§€λ§Œ, μ²˜λ¦¬ν•΄μ•Όν•˜λŠ” μ“°λ ˆλ“œμ˜ μˆ˜λŠ” μ–Έμ œλ‚˜ μ½”μ–΄μ˜ κ°œμˆ˜λ³΄λ‹€ 훨씬 많기 λ•Œλ¬Έμ— 각 μ½”μ–΄κ°€ μ•„μ£Ό 짧은 μ‹œκ°„ λ™μ•ˆ μ—¬λŸ¬ μž‘μμ„ λ²ˆκ°ˆμ•„ κ°€λ©° μˆ˜ν–‰ν•¨μœΌλ‘œμ¨ μ—¬λŸ¬ μž‘μ—…λ“€μ΄ λͺ¨λ‘ λ™μ‹œμ— μˆ˜ν–‰λ˜λŠ” κ²ƒμ²˜λŸΌ 보이게 ν•œλ‹€.

# λ©€ν‹°μ“°λ ˆλ”©μ˜ μž₯단점

λ©€ν‹°μ“°λ ˆλ”©μ˜ μž₯점
  - CPU의 μ‚¬μš©λ₯ μ„ ν–₯μƒμ‹œν‚¨λ‹€.
  - μžμ›μ„ 보닀 효율적으둜 μ‚¬μš©ν•  수 μžˆλ‹€.
  - μ‚¬μš©μžμ— λŒ€ν•œ 응닡성이 ν–₯μƒλœλ‹€.
  - μž‘μ—…μ΄ λΆ„λ¦¬λ˜μ–΄ μ½”λ“œκ°€ 간결해진닀.
  
λ©€ν‹°μ“°λ ˆλ”©μ˜ 단점
  - μ—¬λŸ¬ μ“°λ ˆλ“œκ°€ 같은 ν”„λ‘œμ„ΈμŠ€ λ‚΄μ—μ„œ μžμ›μ„ κ³΅μœ ν•˜λ©΄μ„œ μž‘μ—…μ„ ν•˜κΈ° λ•Œλ¬Έμ— 동기화(synchronization), κ΅μ°©μƒνƒœ(deadlock) 등을 κ³ λ €ν•΄μ„œ ν”„λ‘œκ·Έλž˜λ°ν•΄μ•Όν•œλ‹€. 

μ—¬λŸ¬ μ‚¬μš©μžμ—κ²Œ μ„œλΉ„μŠ€λ₯Ό ν•΄μ£ΌλŠ” μ„œλ²„ ν”„λ‘œκ·Έλž¨μ˜ 경우 λ©€ν‹°μ“°λ ˆλ“œλ‘œ μž‘μ„±ν•˜λŠ” 것은 ν•„μˆ˜μ μ΄μ–΄μ„œ ν•˜λ‚˜μ˜ μ„œλ²„ ν”„λ‘œμ„ΈμŠ€κ°€ μ—¬λŸ¬ 개의 μ“°λ ˆλ“œλ₯Ό μƒμ„±ν•΄μ„œ μ“°λ ˆλ“œμ™€ μ‚¬μš©μž μš”μ²­μ΄ μΌλŒ€μΌλ‘œ μ²˜λ¦¬λ˜λ„λ‘ ν”„λ‘œκ·Έλž˜λ°ν•΄μ•Ό ν•œλ‹€.


# 2. μ“°λ ˆλ“œμ˜ κ΅¬ν˜„κ³Ό μ‹€ν–‰

μ“°λ ˆλ“œλ₯Ό κ΅¬ν˜„ν•˜λŠ” 방법은 Thread클래슀λ₯Ό μƒμ†λ°›λŠ” 방법과 RunnableμΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•˜λŠ” 방법이 μžˆλ‹€.

Thread 클래슀λ₯Ό μƒμ†λ°›μœΌλ©΄ λ‹€λ₯Έ 클래슀λ₯Ό 상속 받을 수 μ—†κΈ° λ•Œλ¬Έμ—, RunnableμΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•˜λŠ” 방법이 μΌλ°˜μ μ΄λ‹€.

# (1) Thread클래슀λ₯Ό 상속

class MyThread extends Thread {
    public void run() { /* μž‘μ—… λ‚΄μš© */ }  // Thread클래슀의 run()을 μ˜€λ²„λΌμ΄λ”©
}

# (2) Runnable μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„

class MyThread implements Runnable {
    public void run() { /* μž‘μ—… λ‚΄μš© */ }  // Runnable μΈν„°νŽ˜μ΄μŠ€μ˜ run()을 κ΅¬ν˜„
                                         // μž¬μ‚¬μš©μ„±(reusability)이 λ†’κ³  μ½”λ“œμ˜ 일관성(consistency)을 μœ μ§€ν•  수 있음
}

# ex) 예제

class ThreadEx1 {
    public static void main(String args[]) {
        ThreadEx1_1 t1 = new ThreadEx1_1();  // Thread의 μžμ† 클래슀의 μΈμŠ€ν„΄μŠ€λ₯Ό 생성 

        Runnable r = new ThreadEx1_2();  // Runnable을 κ΅¬ν˜„ν•œ 클래슀의 μΈμŠ€ν„΄μŠ€λ₯Ό μƒμ„±ν•œ λ‹€μŒ, 이 μΈμŠ€ν„΄μŠ€λ₯Ό Thread클래슀의 μƒμ„±μžμ˜ λ§€κ°œλ³€μˆ˜λ‘œ μ œκ³΅ν•΄μ•Ό ν•œλ‹€. 
        Thread t2 = new Thread(r);  // μƒμ„±μž Thread(Runnable target)

        t1.start();
        t2.start();
    }
}

class ThreadEx1_1 extends Thread {
    public void run() {
        for(int i=0; i<5; i++) {
            System.out.println(getName());  // 쑰상인 Thread의 getName()을 호좜    
        }
    }  
}

class ThreadEx1_2 implements Runnable {
    public void run() {
        for(int i=0; i<5; i++) {
            // Thread.currentThread() - ν˜„μž¬ 싀행쀑인 Threadλ₯Ό λ°˜ν™˜ν•œλ‹€.
            System.out.println(Thread.currentThread().getName());
        }
    }
}
  • Thread 클래슀λ₯Ό μƒμ†λ°›μœΌλ©΄, μžμ† ν΄λž˜μŠ€μ—μ„œ 쑰상인 Thread 클래슀의 λ©”μ„œλ“œλ₯Ό 직접 ν˜ΈμΆœν•  수 μžˆμ§€λ§Œ, Runnable을 κ΅¬ν˜„ν•˜λ©΄ Thread 클래슀의 static λ©”μ„œλ“œμΈ currentThread( )λ₯Ό ν˜ΈμΆœν•˜μ—¬ μ“°λ ˆλ“œμ— λŒ€ν•œ μ°Έμ‘°λ₯Ό μ–»μ–΄ μ™€μ•Όλ§Œ 호좜이 κ°€λŠ₯ν•˜λ‹€.

# μ“°λ ˆλ“œμ˜ μ‹€ν–‰ - start( )

μ“°λ ˆλ“œλ₯Ό μƒμ„±ν•˜κ³  start( )λ₯Ό ν˜ΈμΆœν•΄μ•Όλ§Œ μ“°λ ˆλ“œκ°€ μƒμ„±λœλ‹€.

사싀은 start( )κ°€ ν˜ΈμΆœλ˜μ—ˆλ‹€κ³  ν•΄μ„œ λ°”λ‘œ μ‹€ν–‰λ˜λŠ” 것이 μ•„λ‹ˆλΌ, 일단 μ‹€ν–‰λŒ€κΈ° μƒνƒœμ— μžˆλ‹€κ°€ μžμ‹ μ˜ μ°¨λ‘€κ°€ λ˜μ–΄μ•Ό μ‹€ν–‰λœλ‹€.
μ‹€ν–‰ λŒ€κΈ°μ€‘μΈ μ“°λ ˆλ“œκ°€ ν•˜λ‚˜λ„ μ—†μœΌλ©΄ κ³§λ°”λ‘œ μ‹€ν–‰μƒνƒœκ°€ λœλ‹€.

ν•˜λ‚˜μ˜ μ“°λ ˆλ“œμ— λŒ€ν•΄ start( )κ°€ ν•œ 번만 호좜될 μˆ˜μžˆλ‹€. ν•œ 번 싀행이 μ’…λ£Œλœ μ“°λ ˆλ“œλŠ” λ‹€μ‹œ μ‹€ν–‰ν•  수 μ—†λ‹€.


# 3. start( )와 run( )

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

# 5. μ“°λ ˆλ“œμ˜ μš°μ„ μˆœμœ„

# 6. μ“°λ ˆλ“œ κ·Έλ£Ή(thread group)

# 7. 데λͺ¬ μ“°λ ˆλ“œ(daemon thread)

# 8. μ“°λ ˆλ“œμ˜ μ‹€ν–‰μ œμ–΄

# 9. μ“°λ ˆλ“œμ˜ 동기화


# Reference & Additional Resources

Last Updated: 12/5/2020, 11:36:44 AM