본문 바로가기

Java 공부

12장 스레드 상태 제어(2)

프로그램에서 경우에 따라서는 실행 중인 스레드를 즉시 종료할 필요가 있다.

이때 stop() 메소드로 스레드를 종료할 수 있는데, stop() 메소드는 사용하지 않는 것이 좋다.

stop() 메소드

-스레드를 즉시 종료시킨다.

-스레드를 갑자기 종료하게 되면 사용 중이던 자원들이 불안전한 상태로 남겨진다.

-deprecated : 웬만해선 사용하지 말아라 라는 뜻


따라서 스레드의 안전한 종료를 위해서는 2가지의 방법이 있다.


스레드의 안전한 종료 -  stop 플래그,  interrupt()

1. stop 플래그를 이용하는 방법

-stop 플래그로 메소드(run()메소드)의 정상 종료를 유도한다.

public class XXXThread extends Thread {

private boolean stop;     //stop 플래그 필드


public void run() {

스레드가 반복 실행하는 코드;

}

//스레드가 사용한 자원 정리

}

}


2. interrupt() 메소드를 이용하는 방법

-interrupt() 메소드를 이용하면 "스레드가 일시정지 상태일 경우(ex. Thread.sleep(1000))" InterruptedException을 발생시켜 스레드를 종료한다.

     * stop() 플래그는 일시정지 상태에 있는 스레드를 정지하지 못하는 특성이 있다.

  따라서 일시 정지 상태에 있는 스레드를 정지하고 싶다면 interrupt() 메소드를 사용한다.

-하지만, 스레드가 실행대기 또는 실행상태에서는 interrput() 메소드를 사용해도 InterruptedException가 발생하지 않기 때문에

 스레드가 종료되지 않는다.  

 결국 interrupt() 메소드는 스레드가 일시정지 상태일 경우에만 즉, Thread.sleep(1000); 을 만났을때 비로소 예외를 발생시키고, 

 스레드를 종료시킬 수 있는 것이다.

- 실행대기와 실행 상태에서도 interrupt() 메소드를 사용하여 스레드를 안전하게 종료하고 싶다면?

boolean status = Thread.interrupted();

boolean status = objThread.isInterrupted();

-->두 메소드 모두 해당 스레드가 interrupt() 메소드를 실행 했는가 안했는가의 여부를 boolean타입으로 리턴해주는 메소드.

--> interrupt()메소드를 호출했다면 true 리턴, 호출되지 않았다면 false리턴

--> Thread.interrupted(); 는 Thread클래스에 정의되어 있는 정적메소드로 객체 생성 없이 바로 사용 가능

--> objThread.isInterrupted(); 는 인스턴스 메소드로 객체 생성 후 사용가능


public void run() {

while(true) {

System.out.println("실행 중");

if(Thread.interrupted()) {

break;

}

}

}




본 포스팅은 이것이 자바다 책을 참고하여 작성하였습니다.

'Java 공부' 카테고리의 다른 글

12장 스레드 그룹  (0) 2018.12.09
12장 데몬 스레드  (0) 2018.12.08
12장 스레드 상태 제어(1)  (0) 2018.12.03
12장 스레드 상태  (0) 2018.12.03
12장 동기화 메소드와 동기화 블록  (0) 2018.12.02