- 임계 영역 : 멀티 스레드 프로그램에서 단 하나의 스레드만 실행할 수 있는 코드 영역
- 동기화 : 보내고 받는 영역이 서로 okay 되면 전송하고 받음
임계 영역을 지정하기 위해 동기화 메소드와 동기화 블록 제공 -> 스레드 내부에 동기화 존재 시 객체 잠금 걸어 다른 스레드가 임계 영역 코드를 실행하지 못함
synchronized -> 인스턴스, 정적 메소드 어디든 가능
- 메소드
ex) public synchronized void method(){
//메소드 전체 내용이 임계영역이므로 스레드가 동기화 메소드 실행하는 즉시 객체는 잠금 일어나고 //스레드는 동기화 메소드 실행 종료하면 잠금 풀림
임계 영역 //단 하나의 스레드만 실행
}
- 일부 내용만 임계 영역으로 만들고 싶다면
ex) public void method(){
//여러 스레드가 실행 가능 영역
synchronized(공유 객체){
임계 영역 //단 하나의 스레드만 실행 -> 동기화 블록
}
}
- 외부 코드들은 여러 스레드 동시에 실행할 수 있지만, 동기화 블록 내부 코드는 임계 영역이므로 한번에 한 스레드만 실행할 수 있고, 다른 스레드 실행 불가
- 실행 대기 상태 : 아직 스케줄링이 되지 않아서 실행을 기다리고 있는 상태 ex) 스레드 객체 생성하고, start() 메소드호출하면 상태 대기 상태 됨
- 실행 상태 : 스레드 스케줄링으로 선택된 스레드가 비로서 cpu 점유하고 run() 메소드 실행 -> running 실행 상태
- 대기 상태 : 스레드 스케줄링의 선태 기다리고 있는 상태
실행 대기 상태에는 모두 실행 되기 전에 스레드 스케줄링에 의해 실행 대기상태로 돌아갈 수 있음
그리고 실행 대기 상태에 있는 다른 스레드가 선택되어 실행 상태가 됨 -> 대기/실행 번갈아 자신의 run()을 조금씩 실행
- 종료 상태 : 실행 상태에서 run() 메소드 종료되면, 더 이상 실행할 코드가 없기 때문에 스레드이 실행이 멈춤
- 일시 정지 상태 : 스레드가 실행할 수 없는 상태. WAITING, TIMED_WAITING, BLOCKED
실행 상태로 가기 위해서 일시 정지 상태 -> 실행 대기 상태로 가야함
* 예로 미디어 플레이어에서 동영상 보는 것
- getState() : 스레드의 상태에 따라 Thread.state 열거 상수 리턴
객체 생성 | NEW | 스레드 객체가 생성, 아직 start() 메소드가 호출 되지 않은 상태 |
실행 대기 | RUNNABLE | 실행 상태로 언제든지 갈 수 있는 상태 |
일시 정지 | WAITING | 다른 스레드가 통지할 때까지 기다리는 상태 |
TIMED_WAITING | 주어진 시간 동안 기다리는 상태 | |
BLOCKED | 사용하고자 하는 객체의 락이 풀릴 때까지 기다리는 상태 | |
종료 | TERMINATED | 실행을 마친 상태 |
ex) Thread.State state = targetThread.getState();
if(state == Thread.State.NEW){targetThread.start();}
if(state == Thread.State.TERMINATED){break;}
-<이것이 자바다1>. 한빛미디어