• [JAVA/자바] 스레드 종료

    2023. 6. 7.

    by. 개발도비

    스레드의 종료는 스스로 종료하는 경우와 다른 스레드에 의해 강제종료되는 경우가 있다. 종료된 스레드는 다시 살릴 수 없다. 

     

    스스로 종료

    : 스레드는 run()메소드가 실행 도중 리턴하거나 run()을 완전히 실행하고 리턴하면 종료된다 

    public void run() {
       ...........
       return; //스레드는 스스로 종료한다
       ...........
     }

     

    강제종료

    : 한 스레드가 다른 스레드를 강제종료시키기 위해서는 종료시키고자 하는 스레드의 interrupt() 메소드를 호출하면 된다.

    main()에서 TimerThread 스레드 강제 종료

    main스레드는 TimerThread 스레드를 생성한 뒤, 강제로 종료시키기 위해 TimerThread의 interript()를 호출한다. 그 결과 TimerThread 스레드에 InterruptedException예외가 발생한다. 

    이때 TimerThread는 InterruptedException 예외를 받게 되며 catch 루틴이 실행되어 return하게 되면 run()메소드가 종료된다. 만약 catch 블록에서 return하지 않으면 run()메소드가 끝나지 않기 때문에 다른 스레드에서 interrupt()를 호출해도 TimerThread 스레드는 종료되지 않는다. 

    결론적으로, 스레드 A가 스레드 B를 강제종료시키고자 하는 경우, 다음과 같이 스레드 B의 interrupt()를 호출해야 한다

    B.interrupt(); //스레드 B를 종료시킨다

     

    flag를 이용한 종료

    : 한 스레드가 다른 스레드를 강제로 종료시키는 다른 방법도 있다. 우편배달부가 우체통의 깃발을 올려놓아서 편지가 왔음을 알리고, 집주인은 올라가있는 깃발을 보고 편지가 온 것을 알게 되는 것처럼, 비슷한 방법으로 한 스레드가 다른 스레드를 강제종료시킬 수 있다.

    flag를 이용한 스레드의 강제 종료

    TimerThread 클래스에 boolean 타입의 flag 필드와 finish() 메소드를 추가한다. finish()메소드는 다른 스레드에서 호출하도록 만든 것으로 flag값을 true로 설정하여 스레드가 종료해야 함을 표시한다. 

    main 스레드가 TimerThread 스레드를 종료시키고자 하는 경우, TimerThread 클래스의 finish() 메소드를 호출한다. 한편, TimerThread 스레드는 주기적으로 flag의 값이 true인지 검사하여 true이면 return을 실행하여 스스로 종료한다.

    댓글