JAVA :: 자바 스레드(2)

smi·2021년 2월 21일
0

JAVA (자바)

목록 보기
33/62
post-thumbnail

📝 스레드 종료

ㆍ스스로 종료
ㆍ강제 종료

⚠ 스레드가 종료되면 다시 살릴 수 없다.

💡 스스로 종료

💬 run() 메소드가 종료하거나 리턴하는 경우 종료된다.

💡 강제 종료

💬 종료시키고자 하는 스레드 객체의 interrupt() 메소드를 호출한다.

스레드 A가 스레드 B를 강제 종료시키고자 하는 경우 스레드 B의 interrupt()를 호출하여야 한다. 이때, 스레드 B는 sleep() 코드와 함께 ImterruptedException 예외를 처리하는 try-catch 블록을 가지고 있어야 한다.

B.interrupt();

📝 스레드 동기화

💬 공유 데이터를 동시 접근하는 여러 스레드에 의해 공유 데이터의 값이 비정상적으로 유지되지 않도록 스레드의 실행을 제어하는 기술

💬 방법

ㆍsynchronized로 동기화 블록 지정
ㆍwait()-notify() 메소드로 스레드 실행 순서 제어

💡 synchronized 블록

💬 스레드가 공유 데이터를 접근할 때, 하나씩 순차적으로 실행하도록 제어하는 기법
💬 synchronized 키워드는 스레드 동기화를 위한 장치로서, 임의의 코드 블록을 동기화가 설정된 임계 영역으로 지정

메소드를 임계 영역으로 지정하는 방법

synchronized void print(String text) { // 동기화 메소드
    ...
    for(int i = 0; i < text.length(); i++) // text의 각 문자 출력
        System.out.print(text.charAt(i));
    ...
}    

임의의 코드 블록만 임계 영역으로 지정하는 방법

void execute(String text) {
    ...
    synchronized(this) { // 동기화 코드 블록
        ...
        for(int i = 0; i < text.length(); i++) // text의 각 문자 출력
            System.out.print(text.charAt(i));
        ...
    }    
}    

💡 wait()-notify() 메소드

💬 스레들이 순차적으로 공유 데이터에 접근하도록 제어된 경우라도, 두 스레드가 데이터를 주고 받으면서 충돌이 일어날 수 있는 producer-consumer 문제를 해결


➕ 동기화 객체 : 입력 스레드와 재생 스레드가 대기하는 대상인 스트림 버퍼를 말하며, 자바는 모든 객체가 동기화 객체가 될 수 있다.

profile
공부한 거 올려요 :)

0개의 댓글