//데몬쓰레드와 별개 클래스
private void clock(String flag) throws InterruptedException {
if (flag.equals("-s")) {
clockThread = new Thread(new ClockThread());
clockThread.setDaemon(true);
clockThread.start();
}
if (flag.equals("-q")) {
clockThread.interrupt(); //clockThread를 콕 찌른다
}
}
public class ClockThread extends Thread {
Clock clock = new Clock();
@Override
public void run() {
while (!interrupted()) {
clock.print();
try {
Thread.sleep(5 * 1000);
} catch (InterruptedException e) {
//interrupt당하면 InterruptedException이 발생한다
//그리고 지금 이 쓰레드에서 interrupt()를 호출하여 while문을 탈출하고 쓰레드를 종료한다.
Thread.currentThread().interrupt();
}
}
}
}
실행중인 특정 쓰레드를 종료시키고자 할 때, interrupt
가 지금으로선 내가 찾은 제일 괜찮은 방법인 것 같다.
특정 쓰레드의 인스턴스.interrupt()
를 호출하면 해당 쓰레드에 InterruptedException 에러가 발생하는데, 뭔가 잘못되었다는 뜻은 아니고 interrupt당한 이후의 동작을 수행할 수 있는 여지를 주는? 것이다.
interrupt당한 데몬쓰레드가 catch문Thread.currentThread().interrupt()
로 자기 자신에게 interrupt()
를 호출하면 반복문이 한 번 끝나고 while(interrupted())
로 체크할 때 !interrupted()
가 false
가 되어 while문을 탈출하고, 데몬쓰레드가 종료되게 된다.
interrupt외에 다른 방법으로 쓰레드를 종료시킬 수 없을지 좀 찾아봤었는데, suspend
와 stop
은 deprecated
된 메서드라 사용하지 않는 게 좋을 것 같다. 그리고 벨덩에도 interrupt를 추천하는 글이 있으니 일단 마음놓고 써야겠다.