본문 바로가기

Java

쓰레드 메서드

출처 - 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