thread 는 start() 명령을 받으면 Runnable 상태로 들어가게 됨
이후 cpu 배분을 받으면 Run 상태로 들어감
Not Runnable 상태에 들어가는 경우와 복귀(?) 시간
sleep(time) - time 만큼 시간이 지난 후
wait() - notify() 받을 때까지
join() - 다른 스레드의 결과가 나올 때까지
Thread 우선순위
Thread.MIN_PRIORITY(=1) ~ Thread.MAX_PRIORITY(=10)
디폴트 우선 순위 : Thread.NORMAL_PRIORITY(=5)
G.C 의 PRIORITY = 8 정도 ?( 찾아봐야함)
우선 순위가 높은 Thread 가 CPU 배분을 받을 확률이 높음
setPriority() / getPriority()
join()
스레드의 리턴값이 필요할 때? ?
Join() 사용 방법
Thread 종료
무한 반복의 경우
while(flag) 의 flag 값을 false 로 바꾸어서 종료
Multi Thread 에서 동기화
critical section
두 개 이상의 thread 가 동시에 접근 하는 경우 문제가 생길 수 있기 때문에 동시에 접근 할 수 없는 영역
semaphore 를 얻은 thread만 접근 할 수 있음
semaphore
특별한 형태의 시스템 객체
get/release 두 개의 기능이 있음
하나의 thread 만이 semapore를 얻을 수 있음
나머지 thread 는 대기 상태 ( blocking )
동기화
synchronization
두 개의 thread가 같은 객체에 접근 할 경우, 동시에 접근 함으로써 오류가 발생
동기화는 임계영역에 접근한 경우 공유자원을 lock 하여 다른 thread의 접근을 제어
동기화를 잘못 구현하면 deadlock에 빠질 수 있다
자바에서는 synchronized 메서드나 synchronized 블럭을 사용
synchronized 블럭
현재 객체 또는 다른 객체를 lock으로 만든다
synchronized 메서드
객체의 메소드에 synchronized 키워드 사용
현재 이 메서드가 속해있는 객체에 lock을 건다
자바에서는 deadlock을 방지하는 기술이 제공되지 않으므로 되도록이면 synchronized 메서드에서 다른 synchronized 메서드는 호출하지 않도록 한다.