프로그램에서 경우에 따라서는 실행 중인 스레드를 즉시 종료할 필요가 있다.
이때 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 |