728x90
20220926(월)
- 목차
- 동기화 메소드와 동기화 블록
- 스레드 상태
- 스레드 상태 제어
- 데몬 스레드
< 동기화 메소드와 동기화 블록 >
- 멀티 스레드가 하나의 객체를 공유해서 생기는 오류
- 동기화?
- 한 스레드가 사용 중인 객체를 다른 스레드에서 동시에 접근할 수 없도록 잠금을 걸어둘 수 있는 기능
더보기
user1 스레드가 먼저 메소드를 사용하게되면, lock이 걸리게되고,
user2 스레드는 이 메소드를 진입을 못하게된다.
user1 스레드가 작업이 끝나야 비로소 unlock이 되어,
user2 스레드는 블럭상태가 해제가 되어 아래 메소드를 진입하게 된다.
- 2가지 방법
동기화 메소드 : 메소드에 걸고 싶은 경우 | 동기화 블록 : 직접적인 코드에 걸고 싶은 경우 |
public synchronized void method() { 임계영역; // 단 하나의 스레드만 실행 } |
public void method () { // 여러 스레드가 실행 가능 영역 ... synchronized (공유객체) { 임계 영역 // 단 하나의 스레드만 실행 } // 여러 스레드가 실행 가능 영역 ... } |
< 스레드 상태 >
- 스레드 객체 생성 (NEW) _start() ➡ (실행 대기(RUNNABLE) ↔ 실행) 반복 ➡ 종료(TERMINATED)
- 스레드에 일시정지 상태 도입한 경우
상태 | 열거상수 | 설명 |
객체 생성 | NEW | 스레드 객체가 생성, 아직 start() 메소드가 호출되지 않은 상태 |
실행 대기 | RUNNABLE | 실행 상태로 언제든지 갈 수 있는 상태 |
일시 정지 | BLOCKED | 사용하고자 하는 객체의 락이 풀릴 때까지 기다리는 상태 |
WAITING | 다른 스레드가 통지할 때까지 기다리는 상태 | |
TIMED WATING | 주어진 시간 동안 기다리는 상태 | |
종료 | TERMINATED | 실행을 마친 상태 |
< 스레드 상태 제어 >
- 상태 제어
- 실행 중인 스레드의 상태를 변경하는 것
- 상태 변화를 가져오는 메소드의 종류 (취소선 가진 메소드는 사용 X)
sleep() | 주어진 시간동안 일시 정지 | 얼마 동안 일시 정지 상태로 있을 것인지 밀리 세컨드(1/1000) 단위로 지정 일시 정지 상태에서 interrupt() 메소드 호출 |
yield() | 다른 스레드에게 실행 양보 | |
join() | 다른 스레드의 종료를 기다림 | 계산 작업을 하는 스레드가 모든 계산 작업 마쳤을 때, 결과값을 받아 이용하는 경우 주로 사용 |
wait() notify() notifyAll() |
스레드 간 협업 | 동기화 메소드 또는 블록에서만 호출 가능한 object의 메소드 두 개의 스레드가 교대로 번갈아가며 실행해야 할 경우 주로 사용 |
stop 플래그, interrupt() |
스레드의 안전한 종료 | 경우에 따라 실행 중인 스레드 즉시 종료해야 할 필요 있을 때 사용 |
< 데몬 스레드 >
- 데몬(daemon) 스레드
주 스레드의 작업 돕는 보조적인 역할 수행하는 스레드
주 스레드가 종료되면 데몬 스레드는 강제적으로 자동 종료
워드프로세서의 자동저장, 미디어플레이어의 동영상 및 음악 재생, GC - 스레드를 데몬 스레드로 만들기
주 스레드가 데몬이 될 스레드의 setDaemon(true) 호출
반드시 start() 메소드 호출 전에 setDaemon(true) 호출
그렇지 않으면 IllegalThreadStateException이 발생 - 현재 실행중인 스레드가 데몬 스레드인지 구별법
isDaemon() 메소드의 리턴값 조사 – true면 데몬 스레드
728x90