[Java] Thread (2)
스레드 동기화
- 멀티 스레드는 하나의 객체를 공유해서 작업할 수도 있다.
- 이경우 다른 스레드에 의해 객체 내부 데이터가 쉽게 변경될 수 있기 때문에 스레드가 사용 중인 객체를 다른 스레드가 변경할 수 없도록 하려면 스레드 작업이 끝날때까지 객체에 잠금을 걸면 돤다.
- 이를 위해 자바는 동기화 (synchronized) 메소드와 블록을 제공한다.
- 메소드 선언 synchronized 키워드를 붙이거나 동기화 블록을 만들면 된다
1.동기화 메소드
public synchronized void method() {
// 단하나의 스레드만 실행하는 영역
}
2.동기화 블록
public void method() {
//여러 스레드가 실행할수 있는 영역
synchronized(공유객체) {
//단 하나의 스레드만 실행하는영역
}
//여러 스레드가 실행할 수 있는 영역
}
wait()와 notify() 를 이용한 스레드 제어
- 두개의 스레드를 번갈아가며 실행 할때 사용
- 자신의 작업이 끝나면 상대방 스레드를 일시정지 상테에서 풀어주고 자신은 일시정지 상태로 만들면 된다.
- 주의할 점은 동기화 메소드 또는 동기화 블록 내에서만 사용할 수 있다.
스레드 안전 종료
- 스레드는 자신의 run()메소드가 모두 실행되면 자동적으로 종료되지만 경우에 따라 즉시 종료할 필요가있다(ex- 동영상 시청중 사용자가 멈춤 요구)
- 스레드를 강제종료시키기 위해 stop()메소드를 제공 하고 있지만 사용중인 리소스들이 불안정한 상태로 남겨지기 때문에 더이상 사용하지 않는다.
-스레드를 안전하게 종료하는 방법은 사용하던 리소스들을 정리하고 run()메소드를 빨리 종료하는 것인데 주로 조건이용 방법과 interrupt() 메소드를 이용한다.
데몬 스레드
- 데몬스레드는 주 스레드의 작업을 돕는 보조적인 역할을 수행하는 스레드
- 주 스레드가 종료되면 데몬 스레드도 같이 종료된다.
스레드 풀
- 병렬 작업 처리가 많아지면 스레드의 개수가 폭증하여 성능이 저하된다.
-스레드풀은 스레드를 제한된 개수만큼 정해놓고 작업 큐(Queue)에 들어오는 작업들을 스레드가 하나씩 맡아 처리하는 방식
- java.util.concurrent 패키지에서ExecutorService 인터페이스와 Executors 클래스를 제공