basic/java 이론

day 19~20 - Thread

못지(Motji) 2021. 5. 21. 11:05

Thread 스레드

스레드 생명 주기와 스케줄링

✔ 스레드 상태

💡 Thread Life Cycle : 스레드 생성되고, 실행하고, 잠자고, 대기하고, 종료하는 등 생명주기를 가진다.

  • NEW : 스레드 탄생
  • RUNNABLE : 스레드가 현재 실행되고 있거나 실행 준비되어 스케줄링 기다리는 상태
  • TIMED_WAITING : 스레드가 sleep(long n) 을 호출하여 n밀리초 동안 잠을 자는 상태
  • BLOCK : I/O 작업을 실행하여 작업의 완료를 기다리며 멈춘 상태
  • WAITING : 스레드가 어떤 객체 a에 대해 a.wait() 호출하여 다른 스레드가 a.notify()/a.notifyAll()을
    호출해줄때까지 무한정 기다리는 상태 (Object Class에 속함)
  • TERMINATED : 스레드 종료한 상태

✔ 우선 순위

💡 setPriority(int newPriority) 우선순위 세팅

  • 최대값 MAX_PRIORITY = 10
  • 최소값 MIN_PRIORITY = 1
  • 보통값 NOMAL_PRIORITY = 5

스레드 동기화 Thread Synchronization

✔ 동기화 필요성

  • 멀티스레드 : 다수의 작업을 동시에 실행
    ▹공유 자원 혹은 공유 데이터에 동시 접근할 떄 문제점 발생할 수 있다.
  • 스레드 동기화 방법은 두가지
    ▹synchronized 동기화 블럭 지정
    ▹wait() - notify() 메소드로 스레드 실행 순서 제어

✔ 동기화 키워드 synchronized

  • 순차적 실행을 위한 제어 기법

☑ 메소드 전체를 임계영역으로 지정

synchronized void add(){
	int n = getCurrentSum(); // 스레드가 공유하는 데이터라 생각하고
    n += 10;
    setCurrentSum(n);
}

☑ 코드 블럭을 임계영역으로 지정

void execute(){
	....
    synchronized(this){
   		int n = getCurrentSum();
  	 	n += 10;
    	setCurrentSum(n);
    }
	...
}

❔임계영역 : 독점적으로 공유 데이터를 다루는 프로그램 코드