본문 바로가기

old drawer/Java

[Java] Thread.interrupt() 사용법

자바에서 스레드를 종료할 때는 상태변수(state variable)를 사용해 run() 메소드를 탈출하는 방식을 사용하는데, 이 것을 "state based" singnaling이라 부른다. 기존에 제공되던 Thread.stop(), Thread.suspend(), Thread.resume()은 더 이상 사용할 수 없다.
(참고: Why are Thread.stop, Thread.suspend and Thread.resume Deprecated?)

  • 직접 상태변수를 선언하고 그 것을 이용한다.
     자기 쓰레드의 종료 상태를 지정할 수 있는 상태변수(r/w enabled)를 Runnable 객체의 인스턴스 변수로  정의하고, run() 메소드 내에서 주기적으로 종료 상태를 검사해서 메소드를 탈출(리턴)한다. 상태변수는 volatile로 선언되거나 또는, 동기화된(synchronized) 방법으로 접근되어야 함에 유의한다.
    // state variable
    private volatile boolean terminated = false;
    public void terminate() {
    terminated = true;
    }
    ...
    public void run() {
    // check state, if terminated then return.
    while (!terminated) {
    ...
    }
    }
  • Thread.interrupt()를 이용한다.
     VM 내부적으로 intrrupt status라는 내부변수를 사용하며, 위의 방법으로 다룰 수 없는 상태의 스레드를 종료하는 데 사용할 수 있다. 즉, wait(), wait(long), wait(long, int), 또는 join(), join(long), join(long, int), static sleep(long), static sleep(long, int) 등으로 블럭된(blocked state) 스레드의 경우에 해당 스레드 객체를 통해서 Thread.interrupt()를 호출하는 즉시, 블럭해제됨과 동시에 InterruptedException을 발생시킨다. 그런 후에 interrupt status는 초기화(clear)된다. 따라서 try 구문의 catch 블럭 내에서 적당한 종료 코드를 작성하여 쓰레드를 종료할 수 있으며, run() 메소드 외부에서 InterruptedException을 캐치한 경우에는, InterruptException을 rethrow 하거나, Thread.currentThread().interrupt()를 reassert함으로써 run()메소드까지 interrupt status가 전달되도록 해야 한다. intrrupt status의 상태는 static Thread.interrupted()를 통해서 검사할 수 있다.
    ...
    public void run() {
    while (true) {
    try {
    Thread.sleep(1000);
    } catch (InterruptedException e) {
    // this thread was interrupted while sleeping
    // or before going to sleep
    break;
    }
    try {
    otherObj.doSomething();
    } catch (InterruptedException e) {
    // InterruptedException relayed(rethrowed)
    break;
    }
    if (Thread.interrupted()) {
    // interrupted through Thered.interrupt()
    break;
    }
    ...
    }
    }
    ...
<출처>
http://tears.tistory.com/4

'old drawer > Java' 카테고리의 다른 글

[Java] 자료형  (0) 2011.06.17
[Java] enum 사용법  (0) 2011.06.17
[Java] Runable과 Thread의 차이점  (0) 2011.06.11
[Java] Painting in AWT and Swing  (0) 2011.06.08
[Java] AWT와 Swing의 차이점  (1) 2011.06.07