Day14

피오·2021년 11월 18일
0
post-thumbnail

쓰레드 종료시키기

//데몬쓰레드와 별개 클래스
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외에 다른 방법으로 쓰레드를 종료시킬 수 없을지 좀 찾아봤었는데, suspendstopdeprecated된 메서드라 사용하지 않는 게 좋을 것 같다. 그리고 벨덩에도 interrupt를 추천하는 글이 있으니 일단 마음놓고 써야겠다.



하루 회고

새로 배운 것

  • 추상클래스의 컨셉? 접근법?에 대해 새롭게 배운 바가 있었음. 잘 이해한 건지 조금 애매하다..
    • 클래스를 작성하다 보니 지금 당장 구현하기 애매하고 불가능한 메서드가 있어서 추상 클래스로 남겨둔다. 자손 클래스가 마저 구현해라! O
    • 얘는 처음부터 작정하고 추상클래스로 만들어야지 X

아쉬운 점

  • 오늘 하루 목표를 두지 않았더니 자연히 하루를 적당히 보내게 되었음. 앉아는 있는데 딱히 뭘 했는지 모르는 날. 미션이 없더라도 하루하루 목표를 정해두는 습관을 들이자.

잘한 점

  • 밥을 잘 해먹고 있다. 아이고 대견해~ ㅜㅜ..


참고

profile
블로그 이전했습니다. https://pzbg.tistory.com/

0개의 댓글