Live-Study

[10μ£Όμ°¨] λ©€ν‹°μ“°λ ˆλ“œ ν”„λ‘œκ·Έλž˜λ°

youn12 2021. 2. 19. 16:14
✏️ Info.

- Process, Thread ν•™μŠ΅

πŸ“‹ List.

1. ν”„λ‘œμ„ΈμŠ€(Process)λž€
2. μŠ€λ ˆλ“œ(Thread)λž€
3. Thread ν΄λž˜μŠ€μ™€ Runnable μΈν„°νŽ˜μ΄μŠ€
4. μŠ€λ ˆλ“œμ˜ μƒνƒœ
5. μ“°λ ˆλ“œμ˜ μš°μ„ μˆœμœ„
6. Main μ“°λ ˆλ“œ
7. 동기화
8. λ°λ“œλ½


βœ”οΈ Content.

 

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

 

  • μ‹€ν–‰ 쀑인 ν”„λ‘œκ·Έλž¨
  • μš΄μ˜μ²΄μ œμ— μ˜ν•΄ λ©”λͺ¨λ¦¬ 곡간을 ν• λ‹Ήλ°›μ•„ μ‹€ν–‰ 쀑인 ν”„λ‘œκ·Έλž¨
  • ν”„λ‘œμ„ΈμŠ€λŠ” ν”„λ‘œκ·Έλž¨μ— μ‚¬μš©λ˜λŠ” 데이터, λ©”λͺ¨λ¦¬ λ“±μ˜ μžμ› 그리고 μŠ€λ ˆλ“œ(Thread)둜 κ΅¬μ„±λœλ‹€
  • ν•œ 개의 CPUμ—μ„œ μ‚¬μš©ν•  수 μžˆλŠ” ν”„λ‘œμ„ΈμŠ€λŠ” ν•˜λ‚˜μ΄λ‹€. 

1). ν”„λ‘œμ„ΈμŠ€κ°€ μ–΄λ–»κ²Œ λ™μ‹œμ— μ‹€ν–‰λ˜λŠ”κ°€?

 

  • λ©€ν‹° ν”„λ‘œμ„Έμ‹±(λ‹€μ€‘μ²˜λ¦¬)
    • 두 개 μ΄μƒμ˜ CPUλ₯Ό μ΄μš©ν•˜μ—¬ λ‹€μˆ˜μ˜ ν”„λ‘œμ„ΈμŠ€λ₯Ό μ²˜λ¦¬ν•˜λŠ” 것
  • λ©€ν‹° νƒœμŠ€ν‚Ή(닀쀑 μž‘μ—…)
    • 같은 CPU λ‚΄μ—μ„œ μŠ€μΌ€μ€„λ§μ„ 톡해 μ—¬λŸ¬ 개의 ν”„λ‘œμ„ΈμŠ€λ₯Ό μ²˜λ¦¬ν•˜λŠ” 방식
    • CPUκ°€ λΉ λ₯Έ μ†λ„λ‘œ ν”„λ‘œμ„ΈμŠ€μ˜ ꡐ체λ₯Ό 톡해 λ™μ‹œμ— μ—¬λŸ¬ 개의 ν”„λ‘œμ„ΈμŠ€κ°€ μ‹€ν–‰λ˜κ³  μžˆλ‹€κ³  λŠλ‚€λ‹€.

 

2. μŠ€λ ˆλ“œ(Thread)λž€

 

  • ν”„λ‘œμ„ΈμŠ€ λ‚΄μ—μ„œ μ‹€μ œλ‘œ μž‘μ—…μŠ¬ μˆ˜ν–‰ν•˜λŠ” 주체
  • λͺ¨λ“  ν”„λ‘œμ„ΈμŠ€μ—λŠ” ν•œ 개 μ΄μƒμ˜ μŠ€λ ˆλ“œκ°€ λ°˜λ“œμ‹œ μ‘΄μž¬ν•œλ‹€.
  • 두 개 μ΄μƒμ˜ μŠ€λ ˆλ“œλ₯Ό κ°€μ§€λŠ” ν”„λ‘œμ„ΈμŠ€λ₯Ό λ©€ν‹° μŠ€λ ˆλ“œ ν”„λ‘œμ„ΈμŠ€λΌ ν•œλ‹€.

 

1). λ©€ν‹° μŠ€λ ˆλ“œ(Multi Thread)

 

  • ν•˜λ‚˜μ˜ ν”„λ‘œμ„ΈμŠ€ λ‚΄μ—μ„œ λ‘˜ μ΄μƒμ˜ μŠ€λ ˆλ“œ(Thread)κ°€ λ™μ‹œμ— μž‘μ—…μ„ μˆ˜ν–‰ν•˜λŠ” 것
  • 각 μŠ€λ ˆλ“œλŠ” μžμ‹ μ΄ μ†ν•œ ν”„λ‘œμ„ΈμŠ€ λ©”λͺ¨λ¦¬λ₯Ό κ³΅μœ ν•œλ‹€
    • λ©”λͺ¨λ¦¬ 곡유둜 인해 μ‹œμŠ€ν…œ μžμ›μ˜ λ‚­λΉ„κ°€ 적닀.
  • 각각의 μŠ€λ ˆλ“œκ°€ λ³„λ„μ˜ μž‘μ—…μ„ ν•  수 μžˆμ–΄ μ‚¬μš©μžμ™€μ˜ 응닡성이 μ’‹λ‹€

 

2). λ¬Έλ§₯ κ΅ν™˜(context switching)

 

μ»΄ν“¨ν„°μ—μ„œ λ™μ‹œμ— μ²˜λ¦¬ν•  수 μžˆλŠ” μ΅œλŒ€ μž‘μ—… μˆ˜λŠ” CPU μ½”μ–΄μ˜ κ°œμˆ˜μ™€ κ°™λ‹€

CPU의 μ½”μ–΄μˆ˜λ³΄λ‹€ 더 λ§Žμ€ μŠ€λ ˆλ“œκ°€ μ‹€ν–‰λ˜λ©΄, 각 μ½”μ–΄κ°€ 정해진 μ‹œκ°„ λ™μ•ˆ μ—¬λŸ¬ μž‘μ—…μ„ λ²ˆκ°ˆμ•„κ°€λ©° μˆ˜ν–‰ν•œλ‹€.

β–Ά μ΄λ•Œ 각 μŠ€λ ˆλ“œκ°€ μ„œλ‘œ ꡐ체될 λ•Œ μŠ€λ ˆλ“œ κ°„μ˜ λ¬Έλ§₯ κ΅ν™˜μ΄ λ°œμƒν•œλ‹€

 

  • λ¬Έλ§₯ κ΅ν™˜μ΄λž€ ν˜„μž¬κΉŒμ§€μ˜ μž‘μ—… μƒνƒœλ‚˜ λ‹€μŒ μž‘μ—…μ— ν•„μš”ν•œ 각쒅 데이터λ₯Ό μ €μž₯ν•˜κ³  μ½μ–΄μ˜€λŠ” μž‘μ—…
  • λ¬Έλ§₯ κ΅ν™˜μ— κ±Έλ¦¬λŠ” μ‹œκ°„μ΄ 컀질수둝, λ©€ν‹° μŠ€λ ˆλ”© 효율 μ €ν•˜
  • λ§Žμ€ μ–‘μ˜ λ‹¨μˆœ 계산은 μ‹±κΈ€ μŠ€λ ˆλ“œλ‘œ λ™μž‘ν•˜λŠ” 것이 더 효율적일 수 μžˆλ‹€.
  • λ§Žμ€ 수의 μŠ€λ ˆλ“œλ₯Ό μ‹€ν–‰ν•˜λŠ” 것이 항상 쒋은 μ„±λŠ₯을 λ³΄μ΄μ§€λŠ” μ•ŠλŠ”λ‹€.

3). μŠ€λ ˆλ“œ κ·Έλ£Ή(thread group)

 

  • μ„œλ‘œ 관련이 μžˆλŠ” μŠ€λ ˆλ“œλ₯Ό ν•˜λ‚˜μ˜ 그룹으둜 λ¬Άμ–΄ 닀루기 μœ„ν•œ μž₯치
  • Javaμ—μ„œλŠ” μŠ€λ ˆλ“œ 그룹을 닀루기 μœ„ν•΄ ThreadGroup 클래슀λ₯Ό 제곡
  • λ‹€λ₯Έ μŠ€λ ˆλ“œ 그룹을 포함할 수 있으며, μ΄λŸ¬ν•œ μŠ€λ ˆλ“œ 그룹은 트리 ν˜•νƒœλ‘œ μ—°κ²°λœλ‹€
  • μŠ€λ ˆλ“œλŠ” μžμ‹ μ΄ ν¬ν•¨λœ μŠ€λ ˆλ“œ κ·Έλ£Ήμ΄λ‚˜ ν•˜μœ„ 그룹에 접근이 κ°€λŠ₯ν•˜μ§€λ§Œ, λ‹€λ₯Έ κ·Έλ£Ήμ—λŠ” μ ‘κ·Όν•  수 μ—†λ‹€.
 void threadGroup(){
        
        // Thread Group 생성
        ThreadGroup threadGroup = new ThreadGroup("threadGroup");
        // Thread μƒμ„±μ‹œ Group 전달
        Thread thread = new Thread(threadGroup, "thread");

    }

 

4). 데λͺ¬ μŠ€λ ˆλ“œ(Daemon Thread)

 

  • 데λͺ¬ μŠ€λ ˆλ“œλž€ λ‹€λ₯Έ 일반 μŠ€λ ˆλ“œμ˜ μž‘μ—…μ„ λ•λŠ” 보쑰적인 역할을 ν•˜λŠ” μŠ€λ ˆλ“œλ₯Ό 가리킨닀.
  • 일반 μŠ€λ ˆλ“œκ°€ μ’…λ£Œλ˜λ©΄ 보쑰역할을 ν•˜λŠ” 데λͺ¬μŠ€λ ˆλ“œ μ—­μ‹œ μžλ™μœΌλ‘œ μ’…λ£Œλœλ‹€.
  • μŠ€λž˜λ“œ 생성과 싀행방법은 일반 μŠ€λ ˆλ“œμ™€ κ°™λ‹€
  • 단, μ‹€ν–‰ μ „ setDaemon() λ©”μ†Œλ“œλ₯Ό ν˜ΈμΆœν•˜μ—¬ 데λͺ¬ μŠ€λ ˆλ“œλ‘œ μ„€μ •ν•˜κΈ°λ§Œ ν•˜λ©΄ λœλ‹€.
  • 일정 μ‹œκ°„λ§ˆλ‹€ μžλ™μœΌλ‘œ μˆ˜ν–‰λ˜λŠ” μ €μž₯ 및 ν™”λ©΄ κ°±μ‹  등에 μ΄μš©λœλ‹€.
void daemonThread(){
        
        Thread thread = new Thread();
        thread.setDaemon(true);

    }

3. Thread ν΄λž˜μŠ€μ™€ Runnable μΈν„°νŽ˜μ΄μŠ€

 

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

 

  1. Runnable μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„
  2. Thread 클래슀λ₯Ό 상속
  • 두 방법 λͺ¨λ‘ μŠ€λ ˆλ“œλ₯Ό 톡해 μž‘μ—…ν•˜κ³ μž ν•˜λŠ” λ‚΄μš©μ„ run() λ©”μ†Œλ“œμ— μž‘μ„±ν•˜λ©΄ λœλ‹€.
  • Trhead 클래슀λ₯Ό μƒμ†λ°›μœΌλ©΄ λ‹€λ₯Έ 클래슀λ₯Ό 상속받을 수 μ—†μœΌλ―€λ‘œ, 일반적으둜 Runnable μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•˜λŠ” λ°©λ²•μœΌλ‘œ μŠ€λ ˆλ“œλ₯Ό κ΅¬μ„±ν•œλ‹€.
  • Runnable μΈν„°νŽ˜μ΄μŠ€λŠ” run()λ©”μ†Œλ“œ 단 ν•˜λ‚˜λ§Œμ„ κ°€μ§€λŠ” κ°„λ‹¨ν•œ μΈν„°νŽ˜μ΄μŠ€

 

1). Runnable

 

  • κ΅¬ν˜„
public class CutomThread implements Runnable{
    @Override
    public void run() {
        System.out.println("Implements Runnable Thread()");
    }
}

 

  • ν…ŒμŠ€νŠΈ
  • Runnable은 μž‘μ—… λ‚΄μš©μ„ 가지고 μžˆλŠ” 객체이지 μ‹€μ œ μŠ€λ ˆλ“œκ°€ μ•„λ‹ˆλ‹€.
  • Runnable을 맀개 κ°’μœΌλ‘œ ν•΄μ„œ Thread μƒμ„±μžλ₯Ό ν˜ΈμΆœν•˜λ©΄ λΉ„λ‘œμ†Œ μŠ€λ ˆλ“œκ°€ μƒμ„±λœλ‹€.
void runThread2(){
        Runnable runnable = new CutomThread();
        Thread thread = new Thread(runnable);
        thread.start();
    }

 

2). Thread

 

  • κ΅¬ν˜„
class threadExtendThread extends Thread{

    public void run(){
        System.out.println("Extends Thread()");
    }

}

 

  • ν…ŒμŠ€νŠΈ
void runThread(){
        Thread thread = new threadExtendThread();
        thread.start();
    }

 

3). run(), start()

 

 

run()

  • run() λ©”μ†Œλ“œλŠ” λ‹¨μˆœνžˆ μ“°λ ˆλ“œμ— μ„ μ–Έλœ ν•¨μˆ˜λ₯Ό μ‹€ν–‰ν•˜λŠ” λ©”μ†Œλ“œμ΄λ‹€.
  • μ‹€μ œ μ“°λ ˆλ“œ μ‹€ν–‰μ—λŠ” start() λ©”μ†Œλ“œλ₯Ό ν˜ΈμΆœν•΄μ•Ό ν•œλ‹€.

 

start()

  • μ‹€μ œ μ“°λ ˆλ“œλ₯Ό ν˜ΈμΆœν•˜λŠ” λ©”μ†Œλ“œ
  • ν•˜λ‚˜μ˜ μ“°λ ˆλ“œλ₯Ό start()λ₯Ό 톡해 ν˜ΈμΆœν•  경우 μž¬μ‚¬μš© λΆˆκ°€λŠ₯ν•˜λ‹€.
    • μž¬μ‚¬μš© μ‹œ "IllegalThreadStateException"을 λ°œμƒν•œλ‹€.
public static void main(String[] args) {
        Thread thread = new ExtendsThread();
        Thread thread1 = new Thread(new RunThread());

        thread.start();
        thread1.start();
        
        //μž¬μ‚¬μš©
        thread.start();

    }

4. μŠ€λ ˆλ“œμ˜ μƒνƒœ

 

1). μŠ€λ ˆλ“œ μ‹€ν–‰

 

  • μŠ€λ ˆλ“œ 객체λ₯Ό μƒμ„±ν•˜κ³ , start() λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•˜λ©΄ κ³§λ°”λ‘œ μŠ€λ ˆλ“œκ°€ μ‹€ν–‰λ˜λŠ” κ²ƒμ²˜λŸΌ λ³΄μ΄μ§€λ§Œ μ‹€μ œλ‘œλŠ” μ‹€ν–‰ λŒ€κΈ° μƒνƒœκ°€ λœλ‹€.
    • μ‹€ν–‰ λŒ€κΈ°μƒνƒœ : μŠ€μΌ€μ₯΄λ§μ΄ λ˜μ§€ μ•Šμ•„μ„œ 싀행을 기닀리고 μžˆλŠ” μƒνƒœ
  • μ‹€ν–‰ λŒ€κΈ° μƒνƒœμ— μžˆλŠ” μŠ€λ ˆλ“œ 쀑 μŠ€λ ˆλ“œ μŠ€μΌ€μ₯΄λ§μœΌλ‘œ μ„ νƒλœ μŠ€λ ˆλ“œκ°€ λΉ„λ‘œμ†Œ CPUλ₯Ό μ μœ ν•˜κ³  run() λ©”μ†Œλ“œλ₯Ό μ‹€ν–‰ν•œλ‹€.
    • μ΄λ•Œλ₯Ό μ‹€ν–‰(Running) μƒνƒœλΌ ν•œλ‹€.
    • μ‹€ν–‰ μƒνƒœμ˜ μŠ€λ ˆλ“œλŠ” run() λ©”μ†Œλ“œλ₯Ό λͺ¨λ‘ μ‹€ν–‰ν•˜κΈ° 전에 μŠ€λ ˆλ“œ μŠ€μΌ€μ₯΄λ§μ— μ˜ν•΄ λ‹€μ‹œ μ‹€ν–‰ λŒ€κΈ° μƒνƒœλ‘œ λŒμ•„κ°ˆ 수 μžˆλ‹€.
    • λ‹€λ₯Έ μ‹€ν–‰ λŒ€κΈ° μƒνƒœμ— μžˆλŠ” μŠ€λ ˆλ“œκ°€ μŠ€μΌ€μ₯΄λ§μ— μ˜ν•΄ μ„ νƒλ˜μ–΄ μ‹€ν–‰μƒνƒœλ₯Ό κ°€μ Έκ°„λ‹€
  • μŠ€λ ˆλ“œλŠ” μ‹€ν–‰ λŒ€κΈ° μƒνƒœμ™€ μ‹€ν–‰ μƒνƒœλ₯Ό λ²ˆκ°ˆμ•„ κ°€λ©΄μ„œ μžμ‹ μ˜ run() λ©”μ†Œλ“œλ₯Ό μ‘°κΈˆμ”© μ‹€ν–‰ν•œλ‹€.
  • μ‹€ν–‰ μƒνƒœμ—μ„œ run() λ©”μ†Œλ“œκ°€ μ’…λ£Œλ˜λ©΄, 더 이상 μ‹€ν–‰ν•  μ½”λ“œκ°€ 없어지기 λ•Œλ¬Έμ— μŠ€λ ˆλ“œμ˜ 싀행은 λ©ˆμΆ˜λ‹€. μ΄μƒνƒœλ₯Ό μ’…λ£Œ μƒνƒœλΌ ν•œλ‹€.

 

μŠ€λ ˆλ“œ μƒνƒœ

 

2). μΌμ‹œ 정지

 

  • κ²½μš°μ— 따라 μŠ€λ ˆλ“œλŠ” μ‹€ν–‰ μƒνƒœμ—μ„œ μ‹€ν–‰ λŒ€κΈ° μƒνƒœλ‘œ 가지 μ•Šμ„ μˆ˜λ„ μžˆλ‹€.
  • μ‹€ν–‰ μƒνƒœμ—μ„œ μΌμ‹œ 정지 μƒνƒœλ‘œ 가기도 ν•˜λŠ”λ°, μΌμ‹œ 정지 μƒνƒœλŠ” μŠ€λ ˆλ“œκ°€ μ‹€ν–‰ν•  수 μ—†λŠ” μƒνƒœμ΄λ‹€.
  • μΌμ‹œ 정지 μƒνƒœμ— λ‹€μŒκ³Ό 같이 μžˆλ‹€.
    • WAITING
    • TIMED_WAITING
    • BLOCKED
  • μŠ€λ ˆλ“œκ°€ λ‹€μ‹œ μ‹€ν–‰ μƒνƒœλ‘œ κ°€κΈ° μœ„ν•΄μ„œλŠ” μΌμ‹œ 정지 μƒνƒœμ—μ„œ μ‹€ν–‰ λŒ€κΈ°μƒνƒœλ‘œ κ°€μ•Ό ν•œλ‹€.

 

μ‹€ν–‰ λŒ€κΈ°

 

3). μŠ€λ ˆλ“œ μƒνƒœ 확인

 

  • μŠ€λ ˆλ“œμ˜ μƒνƒœ μ½”λ“œλ₯Ό 확인할 수 μžˆλ„λ‘ ν•˜κΈ° μœ„ν•΄ Java 5λΆ€ν„° Thread ν΄λž˜μŠ€μ— getState() λ©”μ†Œλ“œκ°€ μΆ”κ°€λ˜μ—ˆλ‹€.
  • getState()λ©”μ†Œλ“œλŠ” μŠ€λ ˆλ“œ μƒνƒœμ— 따라 Thread, state μ—΄κ±° μƒμˆ˜λ₯Ό λ¦¬ν„΄ν•œλ‹€.

 

μƒνƒœ μ—΄κ±° μƒμˆ˜ μ„€λͺ…
객체 생성 NEW μŠ€λ ˆλ“œ 객체가 생성, 아직 start() λ©”μ†Œλ“œκ°€ ν˜ΈμΆœλ˜μ§€ μ•Šμ€ μƒνƒœ
μ‹€ν–‰λŒ€κΈ° RUNNABLE μ‹€ν–‰ μƒνƒœλ‘œ μ–Έμ œλ“ μ§€ 갈 수 μžˆλŠ” μƒνƒœ
μΌμ‹œ 정지 WAITING λ‹€λ₯Έ μŠ€λ ˆλ“œκ°€ 톡지할 λ•ŒκΉŒμ§€ κΈ°λ‹€λ¦¬λŠ” μƒνƒœ
TIMED_WAITING 주어진 μ‹œκ°„ λ™μ•ˆ κΈ°λ‹€λ¦¬λŠ” μƒνƒœ
BLOCKED μ‚¬μš©ν•˜κ³ μž ν•˜λŠ” 객체의 락이 풀릴 λ•ŒκΉŒμ§€ κΈ°λ‹€λ¦¬λŠ” μƒνƒœ
μ’…λ£Œ TERMINATED 싀행을 마친 μƒνƒœ

 

4). μŠ€λ ˆλ“œ μƒνƒœ μ œμ–΄

 

μŠ€λ ˆλ“œ μƒνƒœ μ œμ–΄

λ©”μ†Œλ“œ μ„€λͺ…
interrupt() μΌμ‹œ 정지 μƒνƒœμ˜ μŠ€λ ˆλ“œμ—μ„œ InterruptedException μ˜ˆμ™Έλ₯Ό λ°©μƒμ‹œμΌœ, μ˜ˆμ™Έμ²˜λ¦¬(catch)μ½”λ“œμ—μ„œ μ‹€ν–‰ λŒ€κΈ° μƒνƒœλ‘œ κ°€κ±°λ‚˜ μ’…λ£Œ μƒνƒœλ‘œ 갈 수 μžˆλ„λ‘ ν•œλ‹€.
notify()
notifyAll()
동기화 블둝 λ‚΄μ—μ„œ wait() λ©”μ†Œλ“œμ— μ˜ν•΄ μΌμ‹œ 정지 μƒνƒœμ— μžˆλŠ” μŠ€λ ˆλ“œλ₯Ό μ‹€ν–‰ λŒ€κΈ° μƒνƒœλ‘œ λ§Œλ“ λ‹€.
resume() suspend() λ©”μ†Œλ“œμ— μ˜ν•΄ μΌμ‹œ 정지 μƒνƒœμ— μžˆλŠ” μŠ€λ ˆλ“œλ₯Ό μ‹€ν–‰ λŒ€κΈ° μƒνƒœλ‘œ λ§Œλ“ λ‹€.
 - Deprecated (notify(), notifyAll() μ‚¬μš© ꢌμž₯)
sleep(long millis)
sleep(long millis, int nanos)
주어진 μ‹œκ°„ λ™μ•ˆ μŠ€λ ˆλ“œλ₯Ό 정지 μƒνƒœλ‘œ λ§Œλ“ λ‹€.
주어진 μ‹œκ°„μ΄ μ§€λ‚˜λ©΄ μžλ™μ μœΌλ‘œ μ‹€ν–‰ λŒ€κΈ° μƒνƒœκ°€ λœλ‹€.
join()
join(long millis)
join(long millis, int nanos)
join() λ©”μ†Œλ“œλ₯Ό ν˜ΈμΆœν•œ μŠ€λ ˆλ“œλŠ” μΌμ‹œ 정지 μƒνƒœκ°€ λœλ‹€.
μ‹€ν–‰ λŒ€κΈ°μƒνƒœλ‘œ κ°€λ €λ©΄, join() λ©”μ†Œλ“œλ₯Ό λ©€λ²„λ‘œ κ°€μ§€λŠ” μŠ€λ ˆλ“œκ°€ μ’…λ£Œλ˜κ±°λ‚˜, λ§€κ°œκ°’μœΌλ‘œ 주어진 μ‹œκ°„μ΄ μ§€λ‚˜μ•Ό ν•œλ‹€.
wait()
wait(long millis)
wait(long millis, int nanos)
동기화(synchronized) 블둝 λ‚΄μ—μ„œ μŠ€λ ˆλ“œλ₯Ό μΌμ‹œ 정지 μƒνƒœλ‘œ λ§Œλ“ λ‹€.
λ§€κ°œκ°’μœΌλ‘œ 주어진 μ‹œκ°„μ΄ μ§€λ‚˜λ©΄ μžλ™μ μœΌλ‘œ μ‹€ν–‰ λŒ€κΈ° μƒνƒœκ°€ λœλ‹€.
μ‹œκ°„μ΄ 주어지지 μ•Šμ„ 경우 notify(), notifyAll() λ©”μ†Œλ“œμ— μ˜ν•΄ μ‹€ν–‰ λŒ€κΈ° μƒνƒœλ‘œ 갈 수 μžˆλ‹€.
suspend() μŠ€λ ˆλ“œλ₯Ό μΌμ‹œ 정지 μƒνƒœλ‘œ λ§Œλ“ λ‹€. resume() λ©”μ†Œλ“œλ₯Ό ν˜ΈμΆœν•˜λ©΄ λ‹€μ‹œ μ‹€ν–‰ λŒ€κΈ° μƒνƒœκ°€ λœλ‹€.
 - Deprecated (wait() μ‚¬μš© ꢌμž₯)
yield() μ‹€ν–‰ 쀑에 μš°μ„ μˆœμœ„κ°€ λ™μΌν•œ λ‹€λ₯Έ μŠ€λ ˆλ“œμ—κ²Œ 싀행을 μ–‘λ³΄ν•˜κ³  μ‹€ν–‰ λŒ€κΈ° μƒνƒœκ°€ λœλ‹€.
stop() μŠ€λ ˆλ“œλ₯Ό μ¦‰μ‹œ μ’…λ£Œ μ‹œν‚¨λ‹€.
 - Deprecated

 

  • Deprecated : μ‚¬μš© ꢌμž₯ν•˜μ§€ μ•ŠλŠ” λ©”μ†Œλ“œ
  • wait(), notify(), notifyAll() 은 Object 클래슀의 λ©”μ†Œλ“œ, κ·Έ μ™ΈλŠ” Thread 클래슀의 λ©”μ„œλ“œμ΄λ‹€.
  • wait(), notify(), notifyAll() 은 동기화(synchronized) λ©”μ†Œλ“œ λ˜λŠ” 동기화 블둝 λ‚΄μ—μ„œλ§Œ μ‚¬μš© κ°€λŠ₯ν•˜λ‹€.

 

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

 

Javaμ—μ„œ 각 μŠ€λ ˆλ“œλŠ” μš°μ„ μˆœμœ„(priority)에 κ΄€ν•œ μžμ‹ λ§Œμ˜ ν•„λ“œλ₯Ό 가지고 μžˆλ‹€

μ΄λŸ¬ν•œ μš°μ„ μˆœμœ„μ— 따라 νŠΉμ • μŠ€λ ˆλ“œκ°€ 더 λ§Žμ€ μ‹œκ°„ λ™μ•ˆ μž‘μ—…μ„ ν•  수 μžˆλ„λ‘ μ„€μ •ν•œλ‹€.

 

ν•„λ“œ μ„€λͺ…
static int MAX_PRIORITY  μŠ€λ ˆλ“œκ°€ κ°€μ§ˆ 수 μžˆλŠ” μ΅œλŒ€ μš°μ„ μˆœμœ„λ₯Ό λͺ…μ‹œ
static int MIN_PRIORITY  μŠ€λ ˆλ“œκ°€ κ°€μ§ˆ 수 μžˆλŠ” μ΅œμ†Œ μš°μ„ μˆœμœ„λ₯Ό λͺ…μ‹œ
static int NORM_PRIORITY  μŠ€λ ˆλ“œκ°€ 생성될 λ•Œ κ°€μ§€λŠ” κΈ°λ³Έ μš°μ„ μˆœμœ„ λͺ…μ‹œ

 

  • getPriority(), setPriority() λ©”μ†Œλ“œλ₯Ό 톡해 μŠ€λ ˆλ“œμ˜ μš°μ„ μˆœμœ„λ₯Ό λ°˜ν™˜ν•˜κ±°λ‚˜ λ³€κ²½ν•  수 μžˆλ‹€.
  • μš°μ„ μˆœμœ„ λ²”μœ„λŠ” 1~10κΉŒμ§€μ΄λ‹€
  • μˆ«μžκ°€ λ†’μ„μˆ˜λ‘ μš°μ„ μˆœμœ„κ°€ λ†’λ‹€
  • μš°μ„ μˆœμœ„λŠ” μ ˆλŒ“κ°’μ΄ μ•„λ‹Œ μƒλŒ€μ μΈ κ°’
    • μš°μ„ μˆœμœ„κ°€ 10인 μŠ€λ ˆλ“œκ°€ μš°μ„ μˆœμœ„ 1인 μŠ€λ ˆλ“œλ³΄λ‹€ 10λ°° 빨리 μˆ˜ν–‰λ˜λŠ” 것이 μ•„λ‹ˆλ‹€
    • 단지 μš°μ„ μˆœμœ„κ°€ 10인 μŠ€λ ˆλ“œλŠ” μš°μ„ μˆœμœ„ 1인 μŠ€λ ˆλ“œλ³΄λ‹€ μ’€ 더 많이 μ‹€ν–‰ 큐에 ν¬ν•¨λ˜λ©°, μ’€ 더 λ§Žμ€ μž‘μ—… μ‹œκ°„μ„ ν• λ‹Ήλ°›λŠ”λ‹€
  • μŠ€λ ˆλ“œμ˜ μš°μ„ μˆœμœ„λŠ” ν•΄λ‹Ή μŠ€λ ˆλ“œλ₯Ό μƒμ„±ν•œ μŠ€λ ˆλ“œμ˜ μš°μ„ μˆœμœ„λ₯Ό μƒμ†λ°›λŠ”λ‹€.
public void run() {
        System.out.println(" == > this Thread extends Thread : " + this.getName() + " : " + Thread.currentThread().getName());
        for(int i = 0; i < 10; i++){
            System.out.println(Thread.currentThread().getName());
        }
    }
    
    
    
     void test2(){
        Thread thread = new ExtendsThread();
        Thread thread1 = new ExtendsThread();

        // μš°μ„ μˆœμœ„ 10 μ„€μ •
        thread1.setPriority(10);

        System.out.println(thread.getPriority());
        System.out.println(thread1.getPriority());

        thread.start();
        thread1.start();
    }

 

  • tread, tread1을 생성
  • tread1의 μš°μ„ μˆœμœ„λ₯Ό 10으둜 μ„€μ •

μ‹€ν–‰κ²°κ³Ό

Thread-0 : 5
Thread-1 : 10
 == > this Thread extends Thread : Thread-1 : Thread-1
Thread-1
Thread-1
Thread-1
Thread-1
Thread-1
Thread-1
Thread-1
Thread-1
Thread-1
Thread-1
 == > this Thread extends Thread : Thread-0 : Thread-0
Thread-0
Thread-0
Thread-0
Thread-0
Thread-0
Thread-0
Thread-0
Thread-0
Thread-0
Thread-0

 

  • thread의 κΈ°λ³Έ μš°μ„ μˆœμœ„λŠ” 5둜 μ„€μ •λ˜μ–΄ μžˆλ‹€.
  • tread1의 μš°μ„ μˆœμœ„λ₯Ό 10으둜 μ„€μ •ν•˜μ˜€κΈ° λ•Œλ¬Έμ— thread1이 λ¨Όμ € μ‹€ν–‰λ˜κ³  threadκ°€ λ‚˜μ€‘μ— 싀행됨을 μ•Œ 수 μžˆλ‹€.

 

6. Main μ“°λ ˆλ“œ

 

λͺ¨λ“  Java μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ€ 메인 μŠ€λ ˆλ“œκ°€ main() λ©”μ†Œλ“œλ₯Ό μ‹€ν–‰ν•˜λ©΄μ„œ μ‹œμž‘λœλ‹€.

  • 메인 μŠ€λ ˆλ“œλŠ” main() λ©”μ†Œλ“œμ˜ 첫 μ½”λ“œλΆ€ν„° μ•„λž˜λ‘œ 순차적으둜 μ‹€ν–‰
  • main() λ©”μ†Œλ“œμ˜ λ§ˆμ§€λ§‰ μ½”λ“œλ₯Ό μ‹€ν–‰ν•˜κ±°λ‚˜ return 문을 λ§Œλ‚˜λ©΄ μ‹€ν–‰ μ’…λ£Œ
  • 메인 μŠ€λ ˆλ“œλŠ” ν•„μš”μ— 따라 μž‘μ—… μŠ€λ ˆλ“œλ“€μ„ λ§Œλ“€μ–΄μ„œ λ³‘λ ¬λ‘œ μ½”λ“œλ₯Ό μ‹€ν–‰ν•  수 μžˆλ‹€.
    • 즉, λ©€ν‹° μŠ€λ ˆλ“œλ₯Ό μƒμ„±ν•΄μ„œ λ©€ν‹° νƒœμŠ€ν‚Ήμ„ μˆ˜ν–‰ν•œλ‹€.
  • μ‹±κΈ€ μŠ€λ ˆλ“œ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ—μ„œλŠ” 메인 μŠ€λ ˆλ“œκ°€ μ’…λ£Œν•˜λ©΄ ν”„λ‘œμ„ΈμŠ€κ°€ μ’…λ£Œλœλ‹€.
  • λ©€ν‹° μŠ€λ ˆλ“œ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ—λŠ” μ‹€ν–‰ 쀑인 μŠ€λ ˆλ“œκ°€ ν•˜λ‚˜λΌλ„ μžˆλ‹€λ©΄ ν”„λ‘œμ„ΈμŠ€λŠ” μ’…λ£Œλ˜μ§€ μ•ŠλŠ”λ‹€.
    • 메인 μŠ€λ ˆλ“œκ°€ μž‘μ—… μŠ€λ ˆλ“œλ³΄λ‹€ λ¨Όμ € μ’…λ£Œλ˜λ”λΌλ„ μž‘μ—… μŠ€λ ˆλ“œκ°€ 계속 μ‹€ν–‰ 쀑이라면 ν”„λ‘œμ„ΈμŠ€λŠ” μ’…λ£Œλ˜μ§€ μ•ŠλŠ”λ‹€.

 

7. 동기화

 

λ©€ν‹° μŠ€λ ˆλ“œ ν”„λ‘œκ·Έλž¨μ—μ„œλŠ” μŠ€λ ˆλ“œλ“€μ΄ 객체λ₯Ό κ³΅μœ ν•΄μ„œ μž‘μ—…ν•΄μ•Ό ν•˜λŠ” κ²½μš°κ°€ μžˆλ‹€.

이 경우, μŠ€λ ˆλ“œ Aλ₯Ό μ‚¬μš©ν•˜λ˜ 객체가 μŠ€λ ˆλ“œ B에 μ˜ν•΄ μƒνƒœκ°€ 변경될 수 있기 λ•Œλ¬Έμ— μŠ€λ ˆλ“œ Aκ°€ μ˜λ„ν–ˆλ˜ κ²ƒκ³ΌλŠ” λ‹€λ₯Έ κ²°κ³Όλ₯Ό μ‚°μΆœν•  수 μžˆλ‹€.

예둜 μ—¬λŸ¬ μ‚¬λžŒμ΄ ν•˜λ‚˜μ˜ 계산기λ₯Ό 같이 μ“°λŠ” 상황과 κ°™λ‹€. μ‚¬λžŒ Aκ°€ κ³„μ‚°κΈ°λ‘œ μž‘μ—…ν•˜λ‹€ 계산 κ²°κ³Όλ₯Ό λ©”λͺ¨λ¦¬μ— μ €μž₯ν•œ λ’€ μž μ‹œ 자리λ₯Ό 비웠을 λ•Œ μ‚¬λžŒ Bκ°€ 계산기λ₯Ό λ§Œμ Έμ„œ μ‚¬λžŒ Aκ°€ λ©”λͺ¨λ¦¬μ— μ €μž₯ν•œ 값을 λ‹€λ₯Έ κ°’μœΌλ‘œ λ³€κ²½ν•˜λŠ” 것 κ³Όκ°™λ‹€.

 

μ‚¬λžŒ A, B μŠ€λ ˆλ“œ 생성

// μ‚¬λžŒ A
public class UserA extends Thread{
    private Calculator calculator;

    public UserA(Calculator calculator) {
        this.calculator = calculator;
    }

    @Override
    public void run() {
	    this.setName("μ‚¬λžŒ A");
        calculator.setMemory(100);
    }
}

// μ‚¬λžŒ B
public class UserB extends Thread{
    private Calculator calculator;

    public UserB(Calculator calculator) {
        this.calculator = calculator;
    }
    @Override
    public void run() {
    	this.setName("μ‚¬λžŒ B");
        calculator.setMemory(50);
    }
}

//계산기
public void setMemory(int memory) {
        this.memory = memory;

        try {
            System.out.println(Thread.currentThread().getName());
            Thread.sleep(2000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println(Thread.currentThread().getName() + " : " + this.memory);
    }

μ‹€ν–‰

void multiThread(){
        Calculator calculator = new Calculator();
        UserA userA = new UserA(calculator);
        UserB userB = new UserB(calculator);


        userA.start();
        userB.start();

        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

    }

κ²°κ³Ό

 

μ‚¬λžŒ A
μ‚¬λžŒ B
μ‚¬λžŒ B : 50
μ‚¬λžŒ A : 50

 

μŠ€λ ˆλ“œκ°€ μ‚¬μš© 쀑인 객체λ₯Ό λ‹€λ₯Έ μŠ€λ ˆλ“œκ°€ λ³€κ²½ν•  수 없도둝 ν•˜λ €λ©΄ μŠ€λ ˆλ“œ μž‘μ—…μ΄ 끝날 λ•ŒκΉŒμ§€ 객체에 μž κΈˆμ„ κ±Έμ–΄ λ‹€λ₯Έ μŠ€λ ˆλ“œκ°€ μ‚¬μš©ν•  μˆ˜μ—†λ„λ‘ ν•΄μ•Ό ν•œλ‹€.

  • λ©€ν‹° μŠ€λ ˆλ“œ ν”„λ‘œκ·Έλž¨μ—μ„œ 단 ν•˜λ‚˜μ˜ μŠ€λ ˆλ“œλ§Œ μ‹€ν–‰ν•  수 μžˆλŠ” μ½”λ“œ μ˜μ—­μ„ μž„κ³„ μ˜μ—­(Critical Section)이라 ν•œλ‹€.
  • JavaλŠ” μž„κ³„ μ˜μ—­μ„ μ§€μ •ν•˜κΈ° μœ„ν•΄ 동기화(Synchronized) λ©”μ†Œλ“œμ™€ 동기화 블둝을 제곡
  • μŠ€λ ˆλ“œκ°€ 객체 λ‚΄λΆ€μ˜ 동기화 λ©”μ†Œλ“œ λ˜λŠ” 블둝에 λ“€μ–΄κ°€λ©΄ μ¦‰μ‹œ 객체에 μž κΈˆμ„ κ±Έμ–΄ λ‹€λ₯Έ μŠ€λ ˆλ“œκ°€ μž„κ³„ μ˜μ—­ μ½”λ“œλ₯Ό μ‹€ν–‰ν•˜μ§€ λͺ»ν•˜λ„둝 ν•œλ‹€.
  • 동기화 λ©”μ†Œλ“œ 생성 방법은 λ©”μ†Œλ“œ 선언에 synchronized ν‚€μ›Œλ“œλ₯Ό 뢙이면 λœλ‹€.
  • synchronized ν‚€μ›Œλ“œλŠ” μΈμŠ€ν„΄μŠ€μ™€ 정적 λ©”μ†Œλ“œ μ–΄λ””λ“  뢙일 수 μžˆλ‹€.

 

1). synchronized λ©”μ„œλ“œ

public synchronized void method(){
        //μž„κ³„ μ˜μ—­, 단 ν•˜λ‚˜μ˜ μŠ€λ ˆλ“œλ§Œ μ‹€ν–‰
    }

 

2). synchronized μ˜μ—­

public void methodFiled(){
        // 곡유객체 νŒŒλΌλ―Έν„°,곡유 객체가 μžμ‹ μ΄λ©΄ this μ‚¬μš© κ°€λŠ₯
        synchronized (this){
            //μž„κ³„ μ˜μ—­, 단 ν•˜λ‚˜μ˜ μŠ€λ ˆλ“œλ§Œ μ‹€ν–‰
        }
        
        // κ·Έμ™Έ μ—¬λŸ¬ μŠ€λ ˆλ“œκ°€ μ‹€ν–‰ κ°€λŠ₯ν•œ μ˜μ—­
        System.out.println("Thread~");
    }

 

synchronzied μ‚¬μš©ν•˜μ—¬ μ•žμ„  계산기 μ˜ˆμ œμ— 적용

 

계산기 클래슀 setMemory에 synchronzied 적용

public class Calculator {

    int memory;

    public int getMemory() {
        return memory;
    }

    public synchronized void setMemory(int memory) {
        this.memory = memory;

        try {
            System.out.println(Thread.currentThread().getName());
            Thread.sleep(2000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println(Thread.currentThread().getName() + " : " + this.memory);
    }
}

 

μ‹€ν–‰

void multiThread(){
        Calculator calculator = new Calculator();
        UserA userA = new UserA(calculator);
        UserB userB = new UserB(calculator);


        userA.start();
        userB.start();

        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

 

좜λ ₯

 

μ‚¬λžŒ A
μ‚¬λžŒ A : 100
μ‚¬λžŒ B
μ‚¬λžŒ B : 50

 

  • μ‚¬λžŒ A μŠ€λ ˆλ“œλŠ” 계산기(Calculator) 객체의 동기화 λ©”μ†Œλ“œμΈ setMemory()λ₯Ό μ‹€ν–‰ν•˜λŠ” μˆœκ°„ Calculator 객체λ₯Ό μž κ·Όλ‹€.
  • 메인 μŠ€λ ˆλ“œκ°€ μ‚¬λžŒ B μŠ€λ ˆλ“œλ₯Ό μ‹€ν–‰μ‹œν‚€μ§€λ§Œ, 동기화 λ©”μ†Œλ“œμΈ setMemory()λ₯Ό μ‹€ν–‰μ‹œν‚€μ§€λŠ” λͺ»ν•˜κ³  μ‚¬λžŒ Aκ°€ setMemory() λ©”μ†Œλ“œλ₯Ό λͺ¨λ‘ μ‹€ν–‰ν•  λ™μ•ˆ λŒ€κΈ°ν•œ ν›„ μ‚¬λžŒ Bκ°€ setMemory()λ₯Ό μ‚¬μš©ν•œλ‹€.

 

8. λ°λ“œλ½

 

λ°λ“œλ½( deadlock, ꡐ착 μƒνƒœ) λž€ 두 개 μ΄μƒμ˜ μž‘μ—…μ΄ μ„œλ‘œ μƒλŒ€λ°©μ˜ μž‘μ—…μ΄ λλ‚˜κΈ°λ§Œμ„ 기닀리고 μžˆλŠ” μƒνƒœ.

 

  • μ„œλ‘œ μƒλŒ€λ°© μž‘μ—…μ΄ λλ‚˜κΈ° 기닀리고 있기 λ•Œλ¬Έμ— 결과적으둜 아무것도 μ™„λ£Œλ  수 μ—†λ‹€.
  • κ΅μ°©μƒνƒœλ₯Ό μΌμ–΄λ‚˜λ €λ©΄ λ‹€μŒκ³Ό 같은 4가지 ν•„μš”μ‘°κ±΄μ„ μΆ©μ‘±μ‹œμΌœμ•Ό ν•œλ‹€.
    • μƒν˜Έ 배제(Mutual exclusion) : ν”„λ‘œμ„ΈμŠ€λ“€μ΄ ν•„μš”λ‘œ ν•˜λŠ” μžμ›μ— λŒ€ν•΄ 배타적인 ν†΅μ œκΆŒμ„ μš”κ΅¬ν•œλ‹€. ( μž„κ³„ μ˜μ—­ )
    • 점유 λŒ€κΈ°(Hold and wait) : ν”„λ‘œμ„ΈμŠ€κ°€ ν• λ‹Ήλœ μžμ›μ„ 가진 μƒνƒœμ—μ„œ λ‹€λ₯Έ μžμ›μ„ κΈ°λ‹€λ¦°λ‹€.
    • 비선점(No preemption) : ν”„λ‘œμ„ΈμŠ€κ°€ μ–΄λ–€ μžμ›μ˜ μ‚¬μš©μ„ 끝날 λ•ŒκΉŒμ§€ κ·Έ μžμ›μ„ 뺏을 수 μ—†λ‹€.
    • μˆœν™˜ λŒ€κΈ°(Circular wait) : 각 ν”„λ‘œμ„ΈμŠ€λŠ” μˆœν™˜μ μœΌλ‘œ λ‹€μŒ ν”„λ‘œμ„ΈμŠ€κ°€ μš”κ΅¬ν•˜λŠ” μžμ›μ„ 가지고 μžˆλ‹€.
  • μœ„ λ„€ 가지 쑰건쀑 ν•œ 가지라도 λ§Œμ‘±ν•˜μ§€ μ•ŠμœΌλ©΄ κ΅μ°©μƒνƒœλŠ” λ°œμƒν•˜μ§€ μ•ŠλŠ”λ‹€.
  • μˆœν™˜ λŒ€κΈ° 쑰건은 점유 λŒ€κΈ° 쑰건과 비선점 쑰건을 λ§Œμ‘±ν•΄μ•Ό μ„±λ¦½ν•˜λŠ” 쑰건으둜, 4가지 쑰건듀은 μ™„μ „νžˆ 독립적인 것은 μ•„λ‹ˆλ‹€.

λ°λ“œλ½


❗️ Refer.

좜처
- Process, Threadλž€
http://tcpschool.com/java/java_thread_concept
https://ko.wikipedia.org/wiki/%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4

- μ“°λ ˆλ“œ μš°μ„ μˆœμœ„
http://www.tcpschool.com/java/java_thread_concept

- λ°λ“œλ½
https://ko.wikipedia.org/wiki/%EA%B5%90%EC%B0%A9_%EC%83%81%ED%83%9C

- κ·Έ μ™Έ
이것이 μžλ°”λ‹€ 

'Live-Study' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€

[12μ£Όμ°¨] μ• λ…Έν…Œμ΄μ…˜  (0) 2021.02.19
[11μ£Όμ°¨] Enum  (0) 2021.02.19
[9μ£Όμ°¨] μ˜ˆμ™Έ 처리  (0) 2021.02.19
[8μ£Όμ°¨] μΈν„°νŽ˜μ΄μŠ€  (0) 2021.02.19
[7μ£Όμ°¨] νŒ¨ν‚€μ§€  (0) 2021.02.19