μΆμ²
ChatGPT
https://www.baeldung.com/java-thread-lifecycle
μλ°μ μ€λ λ μλͺ μ£ΌκΈ°λ₯Ό μ μμμΌ νλκ°
λ©ν°μ€λ λ νλ‘κ·Έλλ°μ ν¨κ³Όμ μΌλ‘ μμ±νκ³ λλ²κΉ νλ λ° νμμ μ΄λ€.
1. μμ κ΄λ¦¬
μ€λ λκ° μ¬μ©νλ μμ€ν μμμ ν¨μ¨μ μΌλ‘ κ΄λ¦¬νκΈ° μν΄ μ€λ λμ μνλ₯Ό μ΄ν΄νλ κ²μ΄ μ€μνλ€. μλ₯Ό λ€μ΄, νμνμ§ μμ μ€λ λκ° κ³μ μ€νλλ©΄ μμ λλΉκ° λ°μν μ μλ€.
2. λκΈ°ν λ¬Έμ ν΄κ²°
μ€λ λκ° μΈμ μ€νλκ³ μΈμ λ©μΆλμ§λ₯Ό μ΄ν΄νλ©΄ λκΈ°ν λ¬Έμ λ₯Ό ν΄κ²°νλ λ° λμμ΄ λλ€. μλͺ»λ λκΈ°νλ λ°λλ½μ΄λ λ μ΄μ€ 컨λμ κ³Ό κ°μ λ¬Έμ λ₯Ό μΌμΌν¬ μ μλ€.
- λ°λλ½ Deadlock : λ κ° μ΄μμ μ€λ λκ° μλ‘ μλλ°©μ μμμ κΈ°λ€λ¦¬λ©° 무νν λκΈ°νλ μν. μ΄ μνμμλ μ΄λ€ μ€λ λκ³ μ§νν μ μμΌλ―λ‘ νλ‘κ·Έλ¨μ΄ λ©μΆκ² λλ€.
- μμ
- μ€λ λ1μ΄ μμXλ₯Ό μ κΈ(lock) μνλ‘ λ§λ€κ³ μμYλ₯Ό μ»μΌλ € νλ€
- λμμ μ€λ λ2κ° μμYλ₯Ό μ κΈ μνλ‘ λ§λ€κ³ μμXλ₯Ό μ»μΌλ € νλ€
- μ€λ λ1μ μμYκ° νμνκ³ , μ€λ λ2λ μμXκ° νμνλ―λ‘ λ μ€λ λλ μλ‘μ μμμ κΈ°λ€λ¦¬λ©° 무ν λκΈ°μ λΉ μ§λ€.
- λ°λλ½ λ°©μ§ λ°©λ²
- μμμ λν κ³ μ λ νλ μμλ₯Ό μ νκ³ , λͺ¨λ μ€λ λκ° λμΌν μμλ‘ μμμ νλνκ² νλ€.
- νμμμμ μ€μ ν΄ μμμ νλνμ§ λͺ»νλ©΄ ν¬κΈ°νκ³ λ€λ₯Έ μμ μ μλνκ² νλ€.
- μμ
- λ μ΄μ€ 컨λμ
Race Condition : λ κ° μ΄μμ μ€λ λκ° λμμ 곡μ μμμ μ κ·Όνλ©΄μ, κ·Έ κ²°κ³Όκ° μ€λ λμ μ€ν μμμ λ°λΌ λ¬λΌμ§ μ μλ μν©μ μλ―Ένλ€. μ΄λ‘ μΈν΄ μμμΉ λͺ»ν κ²°κ³Όκ° λ°μν μ μλ€.
- μμ
- λ κ°μ μ€λ λκ° κ°μ λ³μ countμ λμμ μ κ·Όν΄ κ°μ μ¦κ°μν¨λ€.
- μ€λ λ Aμ Bκ° κ°κ° count κ°μ μ½κ³ 1μ λν ν, κ°μ λ€μ μ μ₯νλ €κ³ ν λ μ€λ λ Aκ° λ¨Όμ μ€νλκ³ , κ·Έ λ€μ Bκ° μ€νλλ€λ©΄, μ€μ κ²°κ³Όλ μλνλ κ°λ³΄λ€ μ κ² λμ¬ μ μλ€.
- λ μ΄μ€ 컨λμ
λ°©μ§ λ°©λ²
- λκΈ°ν Synchronization : synchronized ν€μλλ ReentrantLockμ μ¬μ©ν΄ 곡μ μμμ λν μ κ·Όμ νλμ μ€λ λλ§ ν μ μλλ‘ νλ€.
- ReentrantLockμ μλ°μμ μ€λ λ λκΈ°νλ₯Ό μν΄ μ 곡λλ ν΄λμ€ μ€ νλ. synchronized ν€μλμ λΉμ·νκ², μκ³ μμμ 보νΈν΄ μ¬λ¬ μ€λ λκ° λμμ 곡μ μμμ μ κ·Όνμ§ λͺ»νλλ‘ νλ€.
- μμμ μ κ·Ό : AtomicIntergerμ κ°μ ν΄λμ€λ₯Ό μ¬μ©ν΄ νΉμ μ°μ°μ΄ λΆν λμ§ μκ³ μμμ μΌλ‘ μνλλλ‘ ν¨.
- μμμ μ΄λ? νΉμ μ°μ°μ΄ λ μ΄μ λλ μ μλ λ¨μλ‘ μνλλ€λ κ²
- μμμ μ°μ°μ μ€μν νΉμ±
- μ€λ¨λμ§ μμ : μ°μ°μ΄ μ€νλλ λμ λ€λ₯Έ μ€λ λκ° κ°μ νκ±°λ μ°μ°μ λ°©ν΄ν μ μλ€. μ¦, μ°μ°μ΄ μλ£λ λκΉμ§λ κ·Έ μνλ₯Ό λ€λ₯Έ μ€λ λκ° μ½κ±°λ μμ ν μ μλ€.
- μΌκ΄μ± 보μ₯ : μμμ μ°μ°μ λ©ν°μ€λ λ νκ²½μμ λμ μ κ·ΌμΌλ‘ μΈν μΌκ΄μ± λ¬Έμ λ₯Ό λ°©μ§νλ€. μλ₯Ό λ€μ΄ μ¬λ¬ μ€λ λκ° κ°μ λ³μμ μ κ·Όν΄ κ°μ λ³κ²½ν λ, μμμ μ°μ°μ μ¬μ©νλ©΄ μμμΉ λͺ»ν κ°μ΄ μ€μ λλ μΌμ΄ μλλ‘ λ³΄μ₯νλ€.
- λκΈ°ν Synchronization : synchronized ν€μλλ ReentrantLockμ μ¬μ©ν΄ 곡μ μμμ λν μ κ·Όμ νλμ μ€λ λλ§ ν μ μλλ‘ νλ€.
- μμ
3. ν¨μ¨μ μΈ μ€λ λ μ‘°μ
μ€λ λμ μλͺ μ£ΌκΈ°λ₯Ό μ΄ν΄νλ©΄ νμν λ μ€λ λλ₯Ό μ€μ§νκ±°λ μ¬μ¬μ©νλ λ±μ μ‘°μμ λ ν¨μ¨μ μΌλ‘ μνν μ μλ€. μλ₯Ό λ€μ΄, WAITING, BLOCKED, TERMINATED μνλ₯Ό μ νν μ΄ν΄νκ³ μ μ ν λ€λ£¨λ κ²μ΄ μ€μνλ€.
4. λλ²κΉ λ° λ¬Έμ ν΄κ²°
μ€λ λ μνλ₯Ό μ΄ν΄νλ©΄ νλ‘κ·Έλ¨μ λΉμ μμ μ΄ λμμ΄λ μ±λ₯ λ¬Έμ λ₯Ό μΆμ νκ³ ν΄κ²°νλ λ° λμμ΄ λλ€. μλ₯Ό λ€μ΄, μ€λ λκ° BLOCKED μνμ μ€λ 머무λ₯Ό κ²½μ° μμΈμ νμ νκ³ ν΄κ²°ν΄μΌ ν μ μλ€.
μ€λ λμ μλͺ μ£ΌκΈ°(NEW, RUNNABLE, BLOCKED, WAITING, TIMED_WAITING, TERMINATED)λ₯Ό μ μ΄μ νλ©΄ μμ μ μ΄κ³ ν¨μ¨μ μΈ λ©ν°μ€λ λ νλ‘κ·Έλ¨μ κ°λ°νλ λ° μ 리νλ€.
μλ°μμ Threadμ μλͺ μ£ΌκΈ°
μλ° μ€λ λλ μ¬λ¬ μνλ₯Ό κ±°μΉλ©΄μ μ€νλλ©°, μ΄λ₯Ό μ€λ λμ μλͺ μ£ΌκΈ°(Thread Lifecycle)λΌκ³ νλ€.
java.lang.Threadλ static State enumμΌλ‘ μ΄ μ€λ λ μνλ₯Ό λνλΈλ€.
1. NEW
- μ€λ λκ° μλ‘ μμ±λμμ§λ§ μμνμ§ μμ μν
- Thread κ°μ²΄κ° μμ±λκ³ start() λ©μλκ° νΈμΆλκΈ° μ μν
- μ : Thread thread = new Thread(runnable);
2. RUNNABLE
- start() λ©μλλ₯Ό νΈμΆνλ©΄ μ€ν κ°λ₯ μνκ° λλ€.
- μ΄ μνμμ μ€λ λλ JVMμ μν΄ μ€μΌμ€λ§λμ΄ μ€μ λ‘ μ€νλ μ μλ€.
- μ€λ λ μ€μΌμ€λ§
- μ¬λ¬ μ€λ λκ° λμμ μ€ν κ°λ₯ν μν©μμ CPUμ μκ°μ μ΄λ»κ² λλ μ κ° μ€λ λμ ν λΉν μ§ κ²°μ νλ λ©μ»€λμ¦. μ΄ κ³Όμ μ JVMμ μ€λ λμ κ΄λ¦¬μ μ΄μ체μ μ μ€μΌμ€λ¬μ μν΄ μ΄λ£¨μ΄μ§λ€.
- μ΄μ 체μ μ μ€μΌμ€λ¬λ λ€μμ κ³ λ €ν΄ κ° μ€λ λλ₯Ό μ€ννλ€
- μ°μ μμ Priority : κ° μ€λ λλ μ°μ μμκ° μμΌλ©°, JVMμ μ΄ μ°μ μμλ₯Ό μ°Έμ‘°ν΄ μλμ μΌλ‘ λμ μ°μ μμμ μ€λ λλ₯Ό λ¨Όμ μ€ννλ €κ³ νλ€.
- 곡μ μ± : μ΄μ 체μ μ μ€μΌμ€λ¬λ κ°λ₯ν ν λͺ¨λ μ€λ λκ° κ³΅μ νκ² CPU μκ°μ μ¬μ©ν μ μλλ‘ κ΄λ¦¬νλ€.
- μν μ ν : μ€λ λκ° WAITING, BLOCKEDμ κ°μ μνμμRUNNABLE μνλ‘ λ°λμμ λ, CPUμμ μΈμ κ·Έ μΈλ₯΄λλ₯Ό μ€νν μ§λ κ²°μ ν΄μΌ νλ€.
- RUNNABLE μνλ μ΄μ 체μ μ λ°λΌ μ€μ μ€ν μ€ λλ μ€ν λκΈ° μ€μΌ μ μλ€.
3. BLOCKED
- μ€λ λκ° λͺ¨λν° λ½μ κΈ°λ€λ¦¬κ³ μμ λ μ΄ μνκ° λλ€.
- λͺ¨λν° λ½ Monitor Lock : μλ°μ λκΈ°ν λ©μ»€λμ¦μμ 곡μ μμμ λν μ κ·Όμ μ μ΄νκΈ° μν΄ μ¬μ©λλ μ κΈ μ₯μΉ. μλ°μμ κ°μ²΄μ λκΈ°ν λΈλ‘μ΄λ λκΈ°ν λ©μλμ μ κ·Όν λ, μ€λ λλ κ·Έ κ°μ²΄μ λͺ¨λν° λ½μ νλν΄μΌ νλ€. λͺ¨λν° λ½μ νλν κ·Έλ λλ§ ν΄λΉ μμμ μ κ·Όν μ μμΌλ©°, λ€λ₯Έ μ€λ λλ λ½μ΄ ν΄μ λ λκ°μ§ κΈ°λ€λ €μΌ νλ€.
- λκΈ°ν λ©μλ Synchronized Method : λ©μλ μ 체λ₯Ό λκΈ°νν΄, ν΄λΉ λ©μλκ° μ€νλλ λμ νλμ μ€λ λλ§ μ κ·Όν μ μλλ‘ νλ λ°©λ²
- λκΈ°ν λΈλ‘ Synchronized Block : μ½λμ νΉμ λΆλΆμ λκΈ°ννκ³ μΆμ λ μ¬μ©λλ€. μ 체 λ©μλλ₯Ό λκΈ°ννλ κ²λ³΄λ€ λ μΈλ°νκ² λκΈ°νλ₯Ό μ μ΄ν μ μμ΄, νμν λλ§ μμμ 보νΈν¨μΌλ‘μ¨ μ±λ₯μ ν₯μμν¬ μ μλ€.
- μλ₯Ό λ€μ΄, λ€λ₯Έ μ€λ λκ° μ΄λ―Έ synchronized λΈλ‘μ μ μ νκ³ μλ κ²½μ°, ν΄λΉ μμμ μ¬μ©ν μ μκΈ° λλ¬Έμ BLOCKED μνκ° λλ€.
4. WAITING
- μ€λ λκ° λ€λ₯Έ μ€λ λμ μμ μ΄ μΌλ£λ λκΉμ§ κΈ°λ€λ¦΄ λ μ΄ μνκ° λλ€.
- Object.wait(), Thread.join(), LockSupport.park()μ κ°μ λ©μλλ₯Ό νΈμΆνλ©΄ μ€λ λλ WAITING μνκ° λλ€.
- LockSupport.park() : μλ°μμ μ€λ λλ₯Ό λκΈ° μνλ‘ μ νμν€λλ° μ¬μ©λλ€.
- WAITING μνμ μ€λ λλ λͺ μμ μΌλ‘ λ€μ νμ±νλ λκΉμ§ μ€νλμ§ μλλ€. μλ₯Ό λ€μ΄, notify() λλ notifyAll()μ νΈμΆν΄ λκΈ° μνμ μ€λ λλ₯Ό κΉ¨μΈ μ μλ€.
5. TIMED_WAITING
- μ€λ λκ° μΌμ μκ° λμ λκΈ°ν λ μ΄ μνκ° λλ€.
- sleep(long millis), wait(long timeout), join(long millis) λ±μ λ©μλλ₯Ό νΈμΆν΄ μΌμ μκ°μ΄ μ§λ ν λ€μ μ€ν κ°λ₯νκ² λλ€.
- TIMED_WAITING μνμμλ μ§μ λ μκ°μ΄ μ§λλ©΄ μλμΌλ‘ μ€ν κ°λ₯ν μνλ‘ λμκ°λ€.
6. TERMINATED
- μ€λ λκ° μμ μ λ§μΉκ³ μ’ λ£λ μν
- μ€λ λμ run() λ©μλκ° μ μμ μΌλ‘ μ’ λ£λκ±°λ μμΈκ° λ°μν΄ μ’ λ£λ λ μ΄ μνκ° λλ€.
- μ΄ μνμμ λ μ€λ λκ° λ μ΄μ μ€νλμ§ μμΌλ©°, λ€μ μμν μ μλ€.
μ€λ λ μλͺ μ£ΌκΈ° μμ
public class ThreadLifeCycleExample extends Thread {
public void run() {
System.out.println("Thread is running...");
try {
Thread.sleep(1000); // TIMED_WAITING μνλ‘ μ΄λ
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Thread has finished executing.");
}
public static void main(String[] args) {
ThreadLifeCycleExample thread = new ThreadLifeCycleExample(); // NEW μν
thread.start(); // RUNNABLE μνλ‘ μ΄λ
try {
thread.join(); // νμ¬ μ€λ λκ° threadμ μ’
λ£λ₯Ό κΈ°λ€λ¦¬λ―λ‘ WAITING μν
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Main thread has finished executing.");
}
}
'λΉ κ΅¬λ© μ±μ°κΈ°' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[Java] volatile ν€μλ - λ³μμ κ°μμ±, μ¬μ λ ¬ λ°©μ§ (0) | 2024.10.01 |
---|---|
[Java] Threadμ stop()κ³Ό interrupt()μ λΉκ΅ (2) | 2024.10.01 |
[μλ£κ΅¬μ‘°] ν΄μ μΆ©λ Hash Collision (1) | 2024.10.01 |
[Java] Retrofit2μμ Annotationμ μ¬μ©νλ λ°©λ² μ΄νΌκΈ° (1) | 2024.09.23 |
[Java] PriorityQueue (2) | 2024.09.18 |