출처 - Java의 정석 기초편 (남궁 성)
1. sleep()
- 현재 쓰레드를 지정된 시간동안 일시정지(특정 쓰레드 지정 불가)
- sleep()→일시정지→시간종료 or interrupt()→InterruptedException(깨우기)→실행대기
- 예외처리 필수(try-catch문의 InterruptedException 발생시 깨어남): delay메서드 생성→호출
static void sleep(long millis) // 천분의 일초 단위 잠 잘 시간
void delay(long millis) {
try {
Thread.sleep(millis);
} catch(InterruptedExceptionn e) {} // 괄호에 아무 내용 안 넣음
}
delay(15); // 호출 → 코드 심플, 편리
2. interrupt()
- sleep(). join(), waint()→interrupt()
- 일시 정지(WAITING)→실행 대기(RUNNABLE)
void interrupt() // 쓰레드 상태 false → true
boolean isInterrupted() // 쓰레드 상태 반환
static boolean interrupted() // 쓰레드 상태 반환 후, false로 초기화
3. suspend()↔resume(), stop()
- 쓰레드의 실행을 일시정지↔재개, 즉시 종료
- 편리하지만 교착 상태(dead-lock) 빠지기 쉬움→사용 권장 안 함(deprecated)
4. join()
- 지정된 시간동안 특정 쓰레드의 작업을 기다림
- 예외처리 필수(try-catch문의 InterruptedException 발생시 깨어남)
void join() // 작업 모두 끝날 때까지
void join(long millis)
void join(ong millis, int nanos)
try {
th1.join(); // th1 작업 끝날때까지 기다림
} catch(InterruptedException e) {}
5. yield()
- 자신에게 주어진 남은 시간을 다음 쓰레드에게 양보하고, 실행 대기
- yield(), interrupt() 적절히 사용→응답성, 효율성 향상
6. 쓰레드 동기화(synchronization)
- 멀티 쓰레드 프로세스→다른 쓰레드의 작업에 영향 미칠 수 있음
- 쓰레드 동기화: 한 쓰레드가 진행중인 작업을 다른 쓰레드가 간섭하지 못하게 막는 것
- 임계 영역 설정: 간섭받지 않아야 하는 문장들 하나로 묶음→synchronized 키워드
- 객체 1개, 락 1개: 임계영역은 락(lock)을 얻은 단 하나의 쓰레드만 출입 가능
1. 메서드 전체 임계 영역 지정
public synchronized void calcSum() {
//...
}
2. 특정한 영역 임계 영역 지정
synchronized(객체의 참조변수) {
//...
}
7. wait()↔notify(), notifyAll()
- wait(): 객체의 loce을 풀고 쓰레드를 해당 객체의 waiting pool에 넣음
- notify(): waiting pool에 대기중인 쓰레드 중 하나 깨움→락 얻어 작업 재개
- notifyAll(): waiting pool에 대기중인 모든 쓰레드 깨움→락 얻는 쓰레드는 하나
- Object클래스에 정의, 동기화 블록 내 사용 가능, 효율적 동기화 가능
'Java' 카테고리의 다른 글
스트림(Stream) (0) | 2022.12.09 |
---|---|
람다, 함수형 인터페이스, 메서드 참조 (0) | 2022.12.08 |
쓰레드(thread) (0) | 2022.11.17 |
애너테이션 (0) | 2022.11.08 |
열거형(enum) (0) | 2022.11.04 |