[Java] λ©€ν‹° μŠ€λ ˆλ“œ ν”„λ‘œκ·Έλž˜λ°

2025. 6. 4. 14:19Β·πŸ› οΈBackend/β˜•Java

βœ… 1. ν”„λ‘œμ„ΈμŠ€μ™€ μŠ€λ ˆλ“œ κ°œλ…

(1) ν”„λ‘œμ„ΈμŠ€

  • ν”„λ‘œκ·Έλž¨μ˜ 톡상적 μ‹€ν–‰ λ‹¨μœ„λ₯Ό μ˜λ―Έν•˜λ©°, μ‰½κ²Œλ§ν•΄ ν”„λ‘œκ·Έλž¨ ν•˜λ‚˜λ₯Ό μ‹€ν–‰ν•˜λ©΄ μ‹€ν–‰ λ‹¨μœ„λ₯Ό ν”„λ‘œμ„ΈμŠ€λΌκ³  λΆ€λ₯Έλ‹€.
  • 즉, Java도 ν”„λ‘œκ·Έλž¨μ΄κΈ° λ•Œλ¬Έμ— 싀행을 ν•˜λ©΄ ν•˜λ‚˜μ˜ ν”„λ‘œμ„ΈμŠ€λ‘œ λ§Œλ“€μ–΄μ Έμ„œ 싀행을 ν•˜κ²Œ λœλ‹€.
  • ν”„λ‘œμ„ΈμŠ€λ‘œ κ΅¬λΆ„ν•˜λŠ” μ΄μœ λŠ”, μ—¬λŸ¬ ν”„λ‘œκ·Έλž¨μ„ ν•¨κ»˜ 돌리기 μœ„ν•΄ ν”„λ‘œμ„ΈμŠ€ λ‹¨μœ„λ‘œ ꡬ뢄을 ν•˜λŠ” 것이닀.
  • ν”„λ‘œκ·Έλž¨μ΄ 싀행이 되면 ν”„λ‘œμ„Έμ„œκ°€ λ˜λŠ”λ°, CPUλŠ” μ—¬λŸ¬ ν”„λ‘œμ„ΈμŠ€λ₯Ό 돌림 이걸 λ©€ν‹°ν…ŒμŠ€ν‚Ήμ΄λΌκ³  함.

(2) μŠ€λ ˆλ“œ

  • ν”„λ‘œμ„ΈμŠ€ 내에 μ‘΄μž¬ν•˜λŠ” μ†Œκ·œλͺ¨ μ‹€ν–‰ 흐름을 μ˜λ―Έν•œλ‹€.
  • ν•˜λ‚˜μ˜ ν”„λ‘œμ„ΈμŠ€ 내에 μ—¬λŸ¬ μŠ€λ ˆλ“œκ°€ λ™μ‹œμ— 싀행이 될 수 있음.
  • ν•˜λ‚˜μ˜ ν”„λ‘œμ„Έμ„œμ•ˆμ—λŠ” μ—¬λŸ¬ μŠ€λ ˆλ“œκ°€ λ§Œλ“€μ–΄μ§ˆ μˆ˜ μžˆμœΌλ©°, ν”„λ‘œμ„Έμ„œκ°€ ν• λ‹Ήλ°›μ€ μžμ›μ„ μŠ€λ ˆλ“œκ°€ κ³΅μœ λ°›μŒ.
  • μžλ°”λŠ” ν•˜λ‚˜μ˜ ν”„λ‘œμ„ΈμŠ€κ°€ μžμ›μ„ ν• λ‹Ήλ°›μ•„ ν•˜λ‚˜μ˜ κΈ°λ³Έ μŠ€λ ˆλ“œκ°€ λ””ν΄νŠΈλ‘œ μž‘μ—…μ„ μˆ˜ν–‰ν•¨.
  • μ‰½κ²Œλ§ν•΄, 기본적으둜 ν•˜λ‚˜μ˜ μŠ€λ ˆλ“œλ₯Ό μ§€μ›ν•΄μ£ΌλŠ”λ°, 그것이 main() λ©”μ„œλ“œλ₯Ό μ‹€ν–‰ν•˜λŠ” 메인 μŠ€λ ˆλ“œμ΄λ‹€.
  • 즉, 단일 μŠ€λ ˆλ“œλ‘œ 기본적으둜 λ™μž‘μ„ ν•˜λŠ” 것이닀. ( μΆ”κ°€μ μœΌλ‘œ μŠ€λ ˆλ“œλ₯Ό λ§Œλ“€μ–΄μ„œ λ©€ν‹° μŠ€λ ˆλ“œ ν”„λ‘œκ·Έλž˜λ° κ°€λŠ₯ )
  • ν•˜λ‚˜μ˜ ν”„λ‘œμ„ΈμŠ€ 내에 μ—¬λŸ¬ μŠ€λ ˆλ“œκ°€ λ§Œλ“€μ–΄μ Έμ„œ λ™μ‹œμ— 싀행될 수 있음, κ·Έλž˜μ„œ μŠ€λ ˆλ“œλ₯Ό κ²½λŸ‰ ν”„λ‘œμ„ΈμŠ€ 라고 뢀름

βœ… 2. λ©€ν‹° μŠ€λ ˆλ“œ κ°œλ…

  • ν•˜λ‚˜μ˜ ν”„λ‘œμ„ΈμŠ€ λ‚΄μ—μ„œ λ™μ‹œ 싀행을 μœ„ν•΄ μ‘΄μž¬ν•˜λŠ” μ—¬λŸ¬ μŠ€λ ˆλ“œλ₯Ό μ˜λ―Έν•œλ‹€.
  • Java ν”„λ‘œκ·Έλž¨μ€ ν•˜λ‚˜μ˜ μŠ€λ ˆλ“œμΈ main μŠ€λ ˆλ“œλ‘œ μ‹œμž‘μ΄ λœλ‹€.
  • main μŠ€λ ˆλ“œμ—μ„œ μžμ‹ μŠ€λ ˆλ“œλ₯Ό λ§Œλ“€κ³  μ‹œμž‘μ„ μ‹œν‚¬ 수 있음.
  • μŠ€λ ˆλ“œλ§ˆλ‹€ μ—¬λŸ¬ μŠ€λ ˆλ“œκ°€ λ™μ‹œμ— 돌깁적으둜 μ‹€ν–‰μ΄λ˜κ³  μ’…λ£Œκ°€ 됨.
  • μ‰½κ²Œλ§ν•΄, main μŠ€λ ˆλ“œμΈ main() λ©”μ„œλ“œ νλ¦„μ—μ„œ μŠ€λ ˆλ“œλ₯Ό λ§Œλ“€μ–΄μ„œ λ”°λ‘œ λ™μž‘μ„ ν•˜κ²Œ λ§Œλ“€ 수 있음.

βœ… 3. μžλ°” Thread 클래슀

  • μžλ°”μ—μ„œλŠ” 기본적으둜 java.lang νŒ¨ν‚€μ§€μ˜ Thread 클래슀λ₯Ό 톡해 μŠ€λ ˆλ“œ 생성관 관리λ₯Ό μœ„ν•œ λ©”μ†Œλ“œλ₯Ό μ œκ³΅ν•΄μ€€λ‹€.
  • μžλ°”μ—μ„œ λ…λ¦½μ μœΌλ‘œ μ‹€ν–‰λ˜λŠ” μž‘μ—… λ‹¨μœ„μΈ μŠ€λ ˆλ“œλ₯Ό κ΅¬ν˜„ν•˜λŠ” 방법은 ν•΄λ‹Ή Thread 클래슀λ₯Ό μƒμ„±ν•˜λŠ” 것이닀.

(1) Thread 클래슀 생성 방법

[1] Thread() 방식

Thread t = new Thread() {
    @Override
    public void run() {
        System.out.println("κΈ°λ³Έ μƒμ„±μžλ‘œ μ‹€ν–‰");
    }
};
t.start();
  • μ•„λ¬΄λŸ° μΈμž”λ„ μ—†λŠ” κΈ°λ³Έ μƒμ„±μžλ‘œ, μ‹€ν–‰ν•  Runnable, μŠ€λ ˆλ“œ 이름도 μ •ν•΄μ§€μ§€ μ•Šκ³  λ§Œλ“œλŠ” 방식
  • 이름이 λ””ν΄νŠΈλ‘œ Thread-n 으둜 λ“€μ–΄κ°€λ©°, run() λ©”μ†Œλ“œλ₯Ό μ˜€λ²„λΌμ΄λ”©ν•˜κ±°λ‚˜, ν•˜μœ„ ν΄λž˜μŠ€μ—μ„œ κ΅¬ν˜„μ„ ν•΄μ€˜μ•Όν•¨.

[2] Thread(String name) 방식

Thread t = new Thread("MyThread") {
    @Override
    public void run() {
        System.out.println("μŠ€λ ˆλ“œ 이름: " + getName());
    }
};
t.start();
  • μŠ€λ ˆλ“œ μ΄λ¦„λ§Œ μ§€μ •ν•˜λŠ” μƒμ„±μž, run()을 μ˜€λ²„λΌμ΄λ”©ν•΄μ„œ κ΅¬ν˜„ν•˜κ±°λ‚˜ ν•˜μœ„ ν΄λž˜μŠ€μ—μ„œ κ΅¬ν˜„ν•΄μ€˜μ•Όν•¨.

[3] Thread(Runnable target) 방식

Runnable task = () -> System.out.println("Runnable둜 μ‹€ν–‰");
Thread t = new Thread(task);
t.start();
  • μ‹€ν–‰ν•  Runnable 객체λ₯Ό λ„˜κ²¨μ„œ μ‹€ν–‰ν•  μž‘μ—…μ„ μ„€μ •ν•˜λŠ” 방식이닀.
  • μŠ€λ ˆλ“œ 이름 섀정은 μ•ˆν•΄μ„œ μžλ™μœΌλ‘œ μ§€μ •λ˜μ§€λ§Œ, Runnable을 톡해 μž‘μ—…μ„ 뢄리할 수 μžˆμ–΄ μœ μ—°μ„±μ΄ λ†’μŒ.
  • 즉, run() λ©”μ„œλ“œλ₯Ό μ˜€λ²„λΌμ΄λ”©ν•˜κ±°λ‚˜ 직접 κ΅¬ν˜„ν•  ν•„μš”κ°€μ—†μŒ. μ΄μœ λŠ” Runnable λžŒλ‹€λ‘œ μž‘μ—…μ„ λ§Œλ“€μ–΄ 놨기 λ•Œλ¬Έ

[4] Thread(Runnable target, String name) 방식

Runnable task = () -> System.out.println("Runnable + μ΄λ¦„μœΌλ‘œ μ‹€ν–‰");
Thread t = new Thread(task, "Worker-1");
t.start();
System.out.println("μŠ€λ ˆλ“œ 이름: " + t.getName());
  • Runnable 객체와 μŠ€λ ˆλ“œ 이름을 λ™μ‹œμ— μ§€μ •ν•˜λŠ” 방식이닀.
  • μž‘μ—… λ‚΄μš©κ³Ό 식별을 λ™μ‹œμ— λͺ…ν™•νžˆ ν•  수 μžˆμ–΄ κ°€μž₯ 자주 μ“°μ΄λŠ” μƒμ„±μž 쀑 ν•˜λ‚˜μ΄λ‹€.

[5] κ²°λ‘ 

  • 결둠은 run() λ©”μ„œλ“œκ°€ ν•„μˆ˜ μš”μ†Œμ΄λ©°, μŠ€λ ˆλ“œλŠ” start() λ©”μ„œλ“œλ‘œ 싀행이 됨.

 

(2) Thread 클래슀 μ£Όμš” λ©”μ†Œλ“œ

  • void start(): run() λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•˜μ—¬ this μŠ€λ ˆλ“œλ₯Ό 싀행을 μ‹œμΌœμ£ΌλŠ” λ©”μ†Œλ“œ
  • String getName(): this μŠ€λ ˆλ“œμ˜ 이름을 λ¦¬ν„΄ν•΄μ€Œ.
  • void setName(String name): this μŠ€λ ˆλ“œμ˜ 이름을 name으둜 λ³€κ²½
  • int getPriority(): this μŠ€λ ˆλ“œμ˜ μš°μ„ μˆœμœ„λ₯Ό 리턴
  • void setPriority(int newPriority): this μŠ€λ ˆλ“œμ˜ μš°μ„ μˆœμœ„λ₯Ό newPriority둜 λ³€κ²½

βœ… 4. λ©€ν‹° μŠ€λ ˆλ“œμ˜ μ‹€ν–‰

  • μžλ°” ν”„λ‘œκ·Έλž¨μ„ μ‹€ν–‰ν•˜λ©΄ λ””ν΄νŠΈλ‘œ μ œκ³΅ν•΄μ£ΌλŠ” μŠ€λ ˆλ“œ 1κ°œκ°€ 있으며 ν•΄λ‹Ή μŠ€λ ˆλ“œκ°€ main() ν•¨μˆ˜λ₯Ό 싀행을 ν•΄μ€Œ.
  • 참고둜 main μŠ€λ ˆλ“œλ₯Ό 포함해 λͺ¨λ“  μŠ€λ ˆλ“œλŠ” λˆ„κ°€ μ–Έμ œ λ¨Όμ € λλ‚ μ§€λŠ” μŠ€μΌ€μ€„λŸ¬μ˜ μ˜ν•΄ 랜덀 처럼 μ’…λ£Œκ°€ 됨.
  • μ‰½κ²Œλ§ν•΄, μžλ°” μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ€ λͺ¨λ“  μ‚¬μš©μž μŠ€λ ˆλ“œκ°€ μ’…λ£Œλ˜μ–΄μ•Ό JVM이 μ™„μ „νžˆ μ’…λ£Œκ°€ λœλ‹€.
  • main μŠ€λ ˆλ“œκ°€ μ’…λ£Œλ˜λ”λΌλ„, λ‹€λ₯Έ μŠ€λ ˆλ“œκ°€ μ‚΄μ•„μžˆμœΌλ©΄ ν”„λ‘œκ·Έλž¨μ€ 계속 싀행이 λœλ‹€λŠ” μ˜λ―Έμ΄λ‹€.
  • 단, μš°λ¦¬κ°€ λ§Œλ“  μŠ€λ ˆλ“œκ°€ "데λͺ¬ μŠ€λ ˆλ“œ"κ°€ μ•„λ‹Œ κ²½μš°μ— ν•œν•΄μ„œ 이닀.
  • 데λͺ¬μŠ€λ ˆλ“œλŠ” λ‹€λ₯Έ 일반 μŠ€λ ˆλ“œκ°€ λλ‚˜μ„œ JVM이 μ’…λ£Œλ˜λ©΄ μžλ™μœΌλ‘œ κ°•μ œ μ’…λ£Œκ°€ λœλ‹€.
  • λ‹€λ§Œ μ°Έκ³  μ‚¬ν•­μœΌλ‘œλŠ” main μŠ€λ ˆλ“œμ˜ μ‹œμž‘μœΌλ‘œ λ‹€λ₯Έ μŠ€λ ˆλ“œκ°€ μ‹œμž‘μ΄ 됨. μ’…λ£ŒλŠ” 각각 λžœλ€μž„.
  • λ©€ν‹° μŠ€λ ˆλ“œ ν”„λ‘œκ·Έλž¨μ˜ μ‹€ν–‰ κ²°κ³ΌλŠ” μ˜ˆμΈ‘ν•  수 μ—†μœΌλ©°, μ‹€ν–‰ κ²°κ³Όκ°€ 맀번 λ‹€λ₯Ό 수 있음.
  • 각 μŠ€λ ˆλ“œλŠ” μ •ν•΄μ§„ μˆœμ„œ 없이 λ…λ¦½μ μœΌλ‘œ 싀행이 됨 ( μŠ€μΌ€μ€„λŸ¬μ˜ μ˜ν•΄ )
  • main μŠ€λ ˆλ“œλŠ” λ‹€λ₯Έ μŠ€λ ˆλ“œλ₯Ό μ‹œμž‘μ‹œν‚€λ‚˜, λ‹€λ₯Έ μŠ€λ ˆλ“œμ˜ μ‹€ν–‰κ³Ό λ¬΄κ΄€ν•˜κ²Œ μ‹€ν–‰λ˜κ³  μ’…λ£Œκ°€ λœλ‹€.

βœ… 5. μŠ€λ ˆλ“œμ˜ μ œμ–΄

  • μŠ€λ ˆλ“œλŠ” μŠ€λ ˆλ“œμ˜ μ—¬λŸ¬ λ©”μ„œλ“œμ™€ ν‚€μ›Œλ“œλ₯Ό 톡해 μ œμ–΄λ₯Ό ν•  수 μžˆλ‹€.
  • μ‰½κ²Œλ§ν•΄, μŠ€λ ˆλ“œ ν΄λž˜μŠ€μ—μ„œ μ—¬λŸ¬ λ©”μ„œλ“œλ₯Ό μ§€μ›ν•΄μ£ΌλŠ”λ°, ν•΄λ‹Ή λ©”μ„œλ“œλ₯Ό μ΄μš©ν•΄μ„œ μŠ€λ ˆλ“œμ˜ μƒνƒœλ₯Ό μ œμ–΄ ν•  수 μžˆλ‹€.
  • 즉, μŠ€λ ˆλ“œμ˜ μ‹€ν–‰ μƒνƒœλ₯Ό λ³€κ²½ν•˜κ±°λ‚˜ 흐름을 μ‘°μ ˆν•˜λŠ”λ° ν•΄λ‹Ή λ©”μ„œλ“œκ°€ 이용이 λœλ‹€.
  • 예λ₯Όλ“€λ©΄, start() / run() / sleep() / join() / interrupt() / yield() ... λ“±μ˜ λ©”μ„œλ“œλ“€μ„ μŠ€λ ˆλ“œμ—μ„œ μ œκ³΅μ„ ν•΄μ€Œ.
  • ν•΄λ‹Ή λ©”μ„œλ“œλ“€μ„ μ΄μš©ν•΄μ„œ μƒνƒœλ₯Ό λ³€κ²½ ν•  수 μžˆλ‹€λŠ” μ˜λ―Έμž„.
  • λ˜ν—Œ, μŠ€λ ˆλ“œκ°€ μ‹€ν–‰ 도쀑 μž μ‹œ λ©ˆμΆ”κ³  λ‚˜μ€‘μ— μ‹€ν–‰λ˜λ”λΌλ„, CPU λ ˆμ§€μŠ€ν„°μ™€ μŠ€νƒ μƒνƒœκ°€ μ •ν™•νžˆ μ €μž₯되고 λ³΅μ›λ˜κΈ° λ•Œλ¬Έμ— μŠ€λ ˆλ“œκ°€ μ€‘λ‹¨λœ λΆ€λΆ„λΆ€ν„° μ•ˆμ „ν•˜κ²Œ μ΄μ–΄μ„œ 싀행이 됨.
  • 즉, 곡유 μžμ›μ— λŒ€ν•œ 동기화 문제만 μ‘°μ‹¬ν•˜λ©΄ 됨.

(1) μŠ€λ ˆλ“œμ˜ μƒνƒœ

  • μƒμ„±λœ μŠ€λ ˆλ“œκ°€ CPUλ₯Ό μ–»μ–΄ μ‹€ν–‰λ˜κ³  μ΅œμ’…μ μœΌλ‘œ μ’…λ£Œλ  λ•ŒκΉŒμ§€ μ—¬λŸ¬ μƒνƒœ λ³€ν™”λ₯Ό κ²ͺ게 됨.
  • JVM이 μ‹€μ œλ‘œ μΈμ‹ν•˜λŠ” μŠ€λ ˆλ“œ μƒνƒœ 즉, 곡식적인 μžλ°” μƒνƒœλŠ” 6κ°€μ§€κ°€ 있음.
  • CPU μ½”μ–΄ ν•œκ°œλ‹Ή μ‹€ν–‰ μƒνƒœμ— λ†“μ—¬μ§ˆ 수 μžˆλŠ” μŠ€λ ˆλ“œμ˜ μˆ˜λŠ” 였직 ν•˜λ‚˜μ΄λ‹€.
  • ν•˜λ‚˜μ˜ μŠ€λ ˆλ“œκ°€ μ‹€ν–‰ 쀑(Running) μƒνƒœμ—μ„œ, μ‹œλΆ„ν• μ— μ˜ν•΄ CPU μ‚¬μš© μ‹œκ°„μ΄ λλ‚˜λ©΄ μ‹€ν–‰ λŒ€κΈ° μƒνƒœ(Runnable)둜 λŒμ•„κ°€κ³ , λ‹€λ₯Έ μŠ€λ ˆλ“œκ°€ μ‹€ν–‰ μƒνƒœλ‘œ μ „ν™˜μ΄ 되게 λœλ‹€.
  • 즉, λ‚΄κ°€ κ΄€λ¦¬ν•˜κΈ° μ „κΉŒμ§€λŠ” 기본적으둜 μš΄μ˜μ²΄μ œμ—μ„œ μŠ€λ ˆλ“œλ“€μ„ μ‹€ν–‰ μƒνƒœ <-> μ‹€ν–‰ λŒ€κΈ° μƒνƒœλ‘œ μžλ™μœΌλ‘œ μŠ€μΌ€μ€„λ§ν•˜λ©° 관리λ₯Ό ν•΄μ£Όκ²Œ λœλ‹€. μ‰½κ²Œλ§ν•΄, μ‹œλΆ„ν• λ‘œ λ²ˆκ°ˆμ•„κ°€λ©΄μ„œ μƒνƒœλ₯Ό λ³€κ²½ν•΄μ£Όλ©΄μ„œ 싀행을 ν•΄μ€€λ‹€κ³  보면 λœλ‹€.

[1] java.lang.Thread.State Enum에 μ •μ˜λœ μŠ€λ ˆλ“œ μƒνƒœ 6κ°€μ§€

  • NEW: Thread κ°μ²΄λŠ” μƒμ„±λ˜μ—ˆμ§€λ§Œ 아직 start()κ°€ ν˜ΈμΆœλ˜μ§€ μ•Šμ€ μƒνƒœλ₯Ό μ˜λ―Έν•œλ‹€.
  • RUNNABLE: μ‹€ν–‰ κ°€λŠ₯ν•œ μƒνƒœ(Running λ˜λŠ” OS에 μ˜ν•΄ μŠ€μΌ€μ€„ λŒ€κΈ° 쀑인 μƒνƒœ) - λŒ€κΈ° μƒνƒœλ‘œ 보면 됨.
  • BLOCKED: λ‹€λ₯Έ μŠ€λ ˆλ“œκ°€ κ°€μ§„ λͺ¨λ‹ˆν„° 락을 κΈ°λ‹€λ¦¬λŠ” μ€‘μ˜ μƒνƒœ
  • WAITING: λ‹€λ₯Έ μŠ€λ ˆλ“œμ˜ λͺ…μ‹œμ μΈ μ•Œλ¦Όμ΄ μžˆμ„ λ•ŒκΉŒμ§€ λ¬΄ν•œ λŒ€κΈ° μƒνƒœ ( wait(), join() λ“± )
  • TIMED_WAITING: 일정 μ‹œκ°„ λ™μ•ˆ λŒ€κΈ° μƒνƒœ ( sleep(), join(timeout) λ“± )
  • TERMINATED: μŠ€λ ˆλ“œκ°€ μ’…λ£Œλœ μƒνƒœ ( run() λ©”μ„œλ“œμ˜ μ’…λ₯˜λ₯Ό μ˜λ―Έν•¨ )

 

(2) μŠ€λ ˆλ“œμ˜ μƒνƒœ μ œμ–΄ λ©”μ„œλ“œ

[1] void setPriority(int newPriority) λ©”μ„œλ“œ

  • μŠ€λ ˆλ“œμ˜ μš°μ„ μˆœμœ„λ₯Ό 변경을 ν•  수 있으며, 높은 μš°μ„ μˆœμœ„λ₯Ό κ°€μ§€λŠ” μŠ€λ ˆλ“œκ°€ CPUλ₯Ό 얻을 ν™•λ₯ μ΄ λ†’μŒ.

[2] static void sleep(long millis) throws InterruptedException λ©”μ„œλ“œ

  • ν˜„μž¬ μ‹€ν–‰ 쀑인 μŠ€λ ˆλ“œκ°€ μ •ν•΄μ§„ μ‹œκ°„ λ™μ•ˆ 싀행을 λ©ˆμΆ”κ³  TIMED_WAITING μƒνƒœλ‘œ λ“€μ–΄κ°€κ²Œ 됨.
  • μ‹œκ°„μ΄ λ‹€ μ§€λ‚˜κ²Œ 되면 RUNNABLE μƒνƒœ 즉, μ‹€ν–‰ λŒ€κΈ° μƒνƒœκ°€ 되며, μŠ€μΌ€μ€„λŸ¬μ˜ μ˜ν•΄ 이후에 μ‹€ν–‰ μƒνƒœκ°€ 됨.
  • λ‹€λ₯Έ μŠ€λ ˆλ“œκ°€ sleep() 된 μŠ€λ ˆλ“œλ₯Ό interrupt() λ©”μ„œλ“œλ₯Ό 톡해 깨우면 InterruptedException μ˜ˆμ™Έ λ°œμƒν•¨.
  • μžλ°”μ—μ„œλŠ” 보톡 잘λͺ»λœ 흐름에 λ”°λ₯Έ 예기치 λͺ»ν•œ λ¬Έμ œκ°€ λ°œμƒν•  λ•Œ μ˜ˆμ™Έλ₯Ό μ‚¬μš©ν•œλ‹€.
  • ν•˜μ§€λ§Œ, InterruptedExcetpion은 μ’€ λ…νŠΉν•˜λ‹€. μ΄μœ λŠ”, μΌμ‹œ μ •μ§€ 쀑인 μŠ€λ ˆλ“œλ₯Ό κΉ¨μš°λŠ” ν–‰μœ„λŠ” μ˜ˆμ™Έμ μΈ μƒν™©μœΌλ‘œ μžλ°”μ—μ„œλŠ” 보고 있으며, μŠ€λ ˆλ“œκ°€ sleep() μ΄λ‚˜, wait() μ€‘μ΄λΌλŠ” 건 이 μž‘μ—…μ„ 마치길 κΈ°λ‹€λ¦°λ‹€λŠ” 자발적 κ²°μ •μœΌλ‘œ 보고있으며, μ™ΈλΆ€μ—μ„œ κ°•μ œλ‘œ interrupt()둜 κΉ¨μš΄λ‹€λŠ”κ±΄ μ˜ˆμ™Έμ μΈ λΆ€λΆ„μœΌλ‘œ κ°„μ£Όλ₯Ό ν•œλ‹€.
  • 즉, interrupt() λ©”μ„œλ“œμ˜ μ˜ν•΄ κΉ¨μ–΄μ§ˆ μŠ€λ ˆλ“œλŠ” μ˜ˆμ™ΈμΈ λΆ€λΆ„μœΌλ‘œ κ°„μ£Όλ₯Ό ν•˜κΈ° λ•Œλ¬Έμ— μ˜ˆμ™Έμ²˜λ¦¬λ₯Ό 해두어야함.

[3] static void yield() λ©”μ„œλ“œ

public class YieldExample {
    public static void main(String[] args) {
        Runnable task = () -> {
            String name = Thread.currentThread().getName();
            for (int i = 0; i < 5; i++) {
                System.out.println(name + " - " + i);
                Thread.yield(); // λ‹€λ₯Έ μŠ€λ ˆλ“œμ—κ²Œ 양보
            }
        };

        Thread t1 = new Thread(task, "Thread-1");
        Thread t2 = new Thread(task, "Thread-2");

        t1.start();
        t2.start();
    }
}
  • ν˜„μž¬ 싀행쀑인 μŠ€λ ˆλ“œκ°€ μž μ‹œ 싀행을 λ©ˆμΆ”κ³  Runnable μƒνƒœ 즉, μ‹€ν–‰ λŒ€κΈ° μƒνƒœλ‘œ 듀어감.
  • ν•˜μ§€λ§Œ, 운영체제 μŠ€μΌ€μ€„λŸ¬κ°€ λ°˜λ“œμ‹œ λ‹€λ₯Έ μŠ€λ ˆλ“œλ₯Ό μ‹€ν–‰ν• μ§€ 보μž₯ν•˜μ§€ μ•ŠλŠ”λ‹€.
  • 즉, yield() 호좜 후에도 λ‹€μ‹œ λ°”λ‘œ 같은 μŠ€λ ˆλ“œκ°€ 싀행될 수 μžˆλ‹€λŠ” μ˜λ―Έμ΄λ‹€.
  • yield()λŠ” 주둜 λ‹€λ₯Έ μŠ€λ ˆλ“œμ—κ²Œ μ‹€ν–‰ 기회λ₯Ό μ£Όκ³  싢을 λ•Œ, CPU 점유 κ²½μŸμ„ μ™„ν™”ν•˜λŠ” μš©λ„λ‘œ 쓰인닀.

[4] void join() throws InterruptedException

Thread t = new Thread(() -> {
    System.out.println("μŠ€λ ˆλ“œ μ‹œμž‘");
    try {
        Thread.sleep(1000);
    } catch (InterruptedException e) {}
    System.out.println("μŠ€λ ˆλ“œ μ’…λ£Œ");
});

t.start();

try {
    System.out.println("main μŠ€λ ˆλ“œκ°€ t μŠ€λ ˆλ“œλ₯Ό κΈ°λ‹€λ¦½λ‹ˆλ‹€.");
    t.join(); // tκ°€ 끝날 λ•ŒκΉŒμ§€ main μŠ€λ ˆλ“œ λŒ€κΈ°
    System.out.println("tκ°€ μ’…λ£Œλ˜μ–΄ main μŠ€λ ˆλ“œκ°€ λ‹€μ‹œ μ‹€ν–‰λ©λ‹ˆλ‹€.");
} catch (InterruptedException e) {
    e.printStackTrace();
}
  • ν˜„μž¬ μ‹€ν–‰ 쀑인 μŠ€λ ˆλ“œκ°€ λ‹€λ₯Έ νŠΉμ • μŠ€λ ˆλ“œκ°€ μ’…λ£Œλ  λ•ŒκΉŒμ§€ 기닀리도둝 ν•˜λŠ” λ©”μ„œλ“œλ₯Ό μ˜λ―Έν•œλ‹€.
  • μŠ€λ ˆλ“œ 두 κ³³μ—μ„œ 각자 μ„œλ‘œ join() λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•˜κ²Œ 되면 λ°λ“œλ½(κ΅μ°©μƒνƒœ)이 λ°œμƒν•˜κ²Œ λœλ‹€.
  • 즉, μ˜μ›νžˆ μ„œλ‘œκ°€ κΈ°λ‹€λ¦¬λŠ” 상황이 λ˜λ²„λ¦Ό. μ΄λŸ¬ν•œ ꡐ착 μƒνƒœλ₯Ό κ³ λ €ν•΄μ„œ μ½”λ“œλ₯Ό μ§œμ•Όν•œλ‹€.

[5] void interrupt() λ©”μ„œλ“œ

  • μŠ€λ ˆλ“œλ₯Ό μΈν„°λŸ½νŠΈμ‹œν‚΄
  • μŠ€λ ˆλ“œκ°€ wait(), join(), sleep()에 μ˜ν•΄ μ€‘λ‹¨λœ μƒνƒœμ˜€λ‹€λ©΄, κ·Έ μƒνƒœμ—μ„œ κΉ¨μ–΄λ‚˜ Runnable μƒνƒœκ°€ 됨.
  • 즉, 쀑단 된 μƒνƒœμ—μ„œ μ‹€ν–‰ λŒ€κΈ° μƒνƒœλ‘œ κ°•μ œλ‘œ 변경을 ν•˜κ²Œ λ§Œλ“œλŠ” λ©”μ„œλ“œμ΄λ‹€. 

 

(3) μŠ€λ ˆλ“œ μƒνƒœ μ œμ–΄λ₯Ό μœ„ν•œ Object 클래슀의 λ©”μ†Œλ“œ

[1] void wait() throws InterruptedException λ©”μ„œλ“œ

  • ν˜„μž¬ μ‹€ν–‰ 쀑인 μ“°λ ˆλ“œλ₯Ό μΌμ‹œ μ •μ§€ μƒνƒœλ‘œ λ§Œλ“œλŠ” λ©”μ„œλ“œμ΄λ‹€.
  • notify() λ˜λŠ” notifyAll() λ©”μ„œλ“œκ°€ 호좜이 될 λ•Œ κΉŒμ§€ λŒ€κΈ°λ₯Ό ν•˜κ²Œ λœλ‹€.
  • νŠΉμ§•μœΌλ‘œλŠ”, synchronized 블둝 μ•ˆμ—μ„œλ§Œ 호좜이 κ°€λŠ₯ν•˜λ‹€.

[2] void wait(long millis) throws InterruptedException

  • vait() λ©”μ„œλ“œμ— μ‹œκ°„ μ œν•œμ„ μ€€ λ©”μ„œλ“œμ΄λ‹€.
  • μ§€μ •ν•œ λ°€λ¦¬μ΄ˆ 만큼만 기닀리고, κ·Έ μ‹œκ°„ λ™μ•ˆ notify() κ°€ ν˜ΈμΆœλ˜μ§€ μ•ŠμœΌλ©΄ μžλ™μœΌλ‘œ κΉ¨μ–΄λ‚˜μ„œ λŒ€κΈ° μƒνƒœλ‘œ λ“€μ–΄κ°„λ‹€.
  • 즉, νƒ€μž„μ•„μ›ƒ κΈ°λŠ₯이 ν¬ν•¨λœ wait() λ©”μ„œλ“œλ₯Ό μ˜λ―Έν•œλ‹€.
  • νŠΉμ§•μœΌλ‘œλŠ”, synchronized λΈ”둝 μ•ˆμ—μ„œλ§Œ ν˜ΈμΆœμ΄ κ°€λŠ₯ν•˜λ‹€.

[3] void notify()

  • wait() μƒνƒœλ‘œ λŒ€κΈ° 쀑인 μ“°λ ˆλ“œλ“€ μ€‘μ—μ„œ ν•œ 개λ₯Ό κΉ¨μš΄λ‹€.
  • μžλ°” λͺ…μ„Έμ„œμ—μ„œλŠ” μ–΄λ–€ μ“°λ ˆλ“œκ°€ κΉ¨μ–΄λ‚ μ§€ λͺ…ν™•ν•˜κ²Œ μ§€μ •ν•˜μ§€ μ•Šκ³ , JVM κ΅¬ν˜„μ— 따라 λ‹€λ₯΄λ‹€κ³  λͺ…μ‹œκ°€ λ˜μ–΄μžˆμŒ.
  • 즉, κΊ μ–΄λ‚˜λŠ” μ“°λ ˆλ“œλŠ” JVM μŠ€μΌ€μ€„λŸ¬κ°€ κ²°μ •ν•˜λŠ”λ°, 사싀상 랜덀 ν˜Ήμ€ μž„μ˜λ‘œ ν•œ μ“°λ ˆλ“œλ₯Ό 골라 κΉ¨μš°λŠ” μ…ˆμ΄λ‹€.
  • νŠΉμ§•μœΌλ‘œλŠ”, synchronized λΈ”둝 μ•ˆμ—μ„œλ§Œ ν˜ΈμΆœμ΄ κ°€λŠ₯ν•˜λ‹€.

'πŸ› οΈBackend > β˜•Java' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€

[Java] ν”„λ‘μ‹œ νŒ¨ν„΄, 정적 ν”„λ‘μ‹œ, 동적 ν”„λ‘μ‹œ: Spring 사둀 쀑심 μ„€λͺ…  (1) 2025.07.09
[Java] μžλ°” 슀트림(Stream) κ°œλ… + 예제 총정리 πŸ“š  (2) 2025.06.03
[Java] μ»¬λ ‰μ…˜ ν”„λ ˆμž„μ›Œν¬ 정리: List, Set, Map μΈν„°νŽ˜μ΄μŠ€μ™€ λŒ€ν‘œ κ΅¬ν˜„μ²΄ 총정리  (0) 2025.05.30
[Java] java.nio μ‚¬μš©λ²• | Path, Files, FileChannel 예제 λͺ¨μŒ  (3) 2025.05.30
[Java] java.io νŒ¨ν‚€μ§€ μž…μΆœλ ₯ 슀트림 μ‰½κ²Œ μ΄ν•΄ν•˜κΈ°  (2) 2025.05.28
'πŸ› οΈBackend/β˜•Java' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€
  • [Java] ν”„λ‘μ‹œ νŒ¨ν„΄, 정적 ν”„λ‘μ‹œ, 동적 ν”„λ‘μ‹œ: Spring 사둀 쀑심 μ„€λͺ…
  • [Java] μžλ°” 슀트림(Stream) κ°œλ… + 예제 총정리 πŸ“š
  • [Java] μ»¬λ ‰μ…˜ ν”„λ ˆμž„μ›Œν¬ 정리: List, Set, Map μΈν„°νŽ˜μ΄μŠ€μ™€ λŒ€ν‘œ κ΅¬ν˜„μ²΄ 총정리
  • [Java] java.nio μ‚¬μš©λ²• | Path, Files, FileChannel 예제 λͺ¨μŒ
junbin2
junbin2
java.lang.NullPointerException
  • junbin2
    bin's Development Diary
    junbin2
  • 전체
    였늘
    μ–΄μ œ
    • 전체보기 (158)
      • πŸŽ“λ°©μ†‘ν†΅μ‹ λŒ€ν•™κ΅ (26)
        • πŸ–₯️컴퓨터과학과 (1)
        • πŸŒμœ λΉ„μΏΌν„°μŠ€ μ»΄ν“¨νŒ… (11)
        • βš™οΈμ»΄ν“¨ν„°μ˜ 이해 (11)
        • πŸ›οΈμ„Έκ³„μ˜μ •μΉ˜μ™€κ²½μ œ (3)
      • πŸ› οΈBackend (55)
        • πŸ“šλ°±μ—”λ“œ 곡뢀 (4)
        • β˜•Java (22)
        • 🌳Spring (13)
        • ⚑Python (13)
        • JavaScript (1)
        • πŸ›’οΈDatabase (0)
        • Algorithm Problem Solving (2)
      • 🌐 Network (7)
        • πŸ“œHTTP (7)
      • πŸš€DevOps (1)
      • Data Structure (1)
      • β›ΊμŠ€νŒŒλ₯΄νƒ€μ½”λ”©ν΄λŸ½ (65)
      • 정보 (1)
      • 정리가 ν•„μš”ν•œ κΈ€ (2)
  • λΈ”λ‘œκ·Έ 메뉴

    • ν™ˆ
    • νƒœκ·Έ
    • λ°©λͺ…둝
  • 링크

    • GitHub
  • 곡지사항

  • 인기 κΈ€

  • νƒœκ·Έ

    λ°©ν†΅λŒ€
    μŠ€ν”„λ§
    Python
    spring
    파이썬
    μœ λΉ„μΏΌν„°μŠ€ μ»΄ν“¨νŒ…κ°œλ‘ 
    λ°©μ†‘λŒ€
    세계화
    μœ λΉ„μΏΌν„°μŠ€
    Spring Framework
    μžλ°”
    μž…μΆœλ ₯
    컴파일러
    Java
    클래슀
    ν΄λΌμš°λ“œ
    λ‹€ν˜•μ„±
    μ»΄ν“¨ν„°μ˜ 이해
    λ°©μ†‘ν†΅μ‹ λŒ€ν•™κ΅
    μœ λΉ„μΏΌν„°μŠ€ μ»΄ν“¨νŒ…
  • 졜근 λŒ“κΈ€

  • 졜근 κΈ€

  • hELLOΒ· Designed Byμ •μƒμš°.v4.10.1
junbin2
[Java] λ©€ν‹° μŠ€λ ˆλ“œ ν”„λ‘œκ·Έλž˜λ°
μƒλ‹¨μœΌλ‘œ

ν‹°μŠ€ν† λ¦¬νˆ΄λ°”