stop() - Deprecated, 스레드 안전한 종료 방법-stop 플래그를 통한 스레드 종료 유도, interrupt()메소드를 이용한 방법, interrupted()와 isInterrupted()를 이용한 방법

CODEDRAGON Development/Java

반응형

 

 

stop() - Deprecated

·       스레드는 자신의 run() 메소드가 모두 실행되면 자동적으로 종료됩니다.

·       경우에 따라서 기능 실행 중인 스레드를 즉시 종료할 필요가 있습니다예를 들어 동영상 시청 중 보는 중간에 멈추거나 파일 다운로드 중 중간에 중지하기 등을 예로 들 수 있습니다.

·       Thread 클래스는 스레드를 즉시 종료시키기 위해서 stop() 메소드를 제공합니다

·       stop() 메소드로 스레드를 갑자기 종료시키면 스레드가 사용 중이던 자원(파일, 네트워크 등)들이 불안전한 상태로 남겨지기 때문에 해당 메소드는 Deprecated 되었습니다.

 

 

 

스레드 안전한 종료 방법

·       stop 플래그를 통한 스레드 종료 유도

·       interrupt()메소드를 이용한 방법

·       interrupted() isInterrupted()를 이용한 방법

 

 

 

 

stop 플래그를 통한 스레드 종료 유도

스레드는 run()메소드가 끝나면 자동적으로 종료되므로 stop()메소드 사용 대신 run()메소드가 정상적으로 종료되도록 코드를 작성해야 합니다.

 

stop 필드가 false일 경우에는 while문의 조건식이 true가 되어 반복 실행되지만, stop필드가 true일 경우에는 while문의 조건식이 false가 되어 while문을 빠져 나옵니다. 그리고 이후에 있는 문장을 통해 스레드가 사용한 자원을 정리하고, run()메소드가 끝나게 되므로 스레드는 안전하게 종료하게 됩니다.

class XxxxxThread extends Thread {

// stop 플래그 필드

private boolean stop;

public void setStop(boolean stop) {

  this.stop = stop;

}

public void run() {   

// stop true 되면 run() 메소드가 종료됩니다.

while(!stop) {

// 스레드가 반복 실행하는 코드 영역

System.out.println("스레드 실행 ");

}

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

System.out.println("스레드가 사용한 자원 정리");

System.out.println("실행 종료");

}

}

 

 

 

 

interrupt()메소드를 이용한 스레드 종료 방법

interrupt()메소드는 스레드가 일시 정지 상태에 있을 때 InterruptedException예외를 발생시키는 역할을 합니다. 이 메소드를 이용해서 run()메소드를 정상 종료시킬 수 있습니다.

 

ThreadA ThreadB를 생성해서 start() 메소드로 ThreadB를 실행한 경우 ThreadA ThreadB interrupt()메소드를 실행하게 되면 ThreadB sleep() 메소드로 일시 정지 상태가 될 때 ThreadB에서 InterruptedException이 발생하여 예외처리(cactch)블록으로 이동합니다.

결국 ThreadB whiel문을 빠져나와 run()메소드를 정상 종료하게 됩니다.


 

스레드가 실행 대기 또는 실행 상태에 있을 때에 interrupt() 메소드가 호출되면 그 즉시 InterruptedException 예외가 발생하지 않고 스레드가 일시 정지 상태가 되면 그 때 InterruptedException 예외가 발생합니다.(주의)

그렇기 때문에 스레드가 일시정지 상태가 되지 않으면 interrupt() 메소드 호출은 아무런 의미가 없습니다. 그러므로 짧은 시간이나마 일시 정지 시키기 위한 Thread.sleep(1) 메소드를 사용해 주어야 합니다.

 

 

 

interrupted() isInterrupted()를 이용한 스레드 종료 방법

interrupt()메소드가 호출되었다면 스레드의 interrupted()메소드와 isInterrupted()메소드를 호출하면 true값이 리턴되어 interrupt()메소드 호출 여부를 확인할 수 있습니다.

interrupted()는 정적 메소드로 현재 스레드가 interrupted되었는지를 확인하는 메소드이고

isInterrupted()는 인스턴스 메소드로 현재 스레드가 interrupted되었는지 확인할 때 사용하는 메소드 입니다. 둘 중 어느 것을 사용해도 됩니다.

 

boolean status = Thread.interrupted();

boolean status = threadA.isInterrupted();

 

 

반응형