016 Thread Stop Flag

강의 메모 - 스레드 중지 – flag variable vs interrupt() - 1,2 #

개요 #

  • 자바에서는 무한 반복이나 지속적인 실행 중에 있는 스레드를 중지하거나 종료할 수 있는 API 를 더 이상 사용할 수 없다 (suspend(), stop())
    • 수행 중에 강제로 종료해버리면 이슈가 생길 수 있기 때문
  • 스레드를 종료하는 방법은 플래그 변수를 사용하거나 interrupt() 를 활용해서 구현할 수 있다

Flag Variable #

  • 플래그 변수의 값이 어떤 조건에 만족할 경우 스레드의 실행을 중지하는 방식
  • 플래그 변수는 동시성 문제로 가능한 atomic 변수나 volatile 키워드를 사용하도록 한다
    • 동시성 문제 때문
    • running 변수는 여러 쓰레드가 있다. running은 메모리에 있다. T1, T2, T3, T4, T5가 있을때 T1이 running에 false를 주면, T1이 아닌 그 외 쓰레들도 메모리를 보고 false로 보게된다.
    • 따라서 모든 쓰레드가 메모리를 바라보도록 해야한다.
    • T1 쓰레드가 running을 false로 바꾸고 메모리를 바꿔야 다른 쓰레드도 바라볼텐데, 본인의 캐시에만 업데이트 해버리면 다른 쓰레드는 true이다.
    • 그럼 나머지 쓰레드는 계속적으로 작업을 수행하게된다.

interrupted() & isInterrupted() #

  • 실행 중인 스레드에 interrupt() 하게 되면 인터럽트 상태를 사용해서 종료기능을 구현할 수 있다
  • interrupt() 한다고 해서 스레드가 처리하던 작업이 중지되는 것이 아니며 인터럽트 상태를 활용하여 어떤 형태로든 스레드를 제어할 수 있다

interrupted() #

img_2.png

  • 스레드가 실행되면 Thread.interrupted() 가 false 이므로 반복문을 계속 실행한다
  • 인터럽트가 발생하면 Thread.interrupted() 은 true 이고 반복문을 빠져 나오면서 스레드는 종료된다
  • 인터럽트 상태는 해제 된다

isInterrupted() #

img_3.png

  • 스레드가 실행되면 Thread.currentThread().isInterrupted() 가 false 이므로 반복문을 계속 실행한다
  • 인터럽트가 발생하면 Thread.currentThread().isInterrupted() 은 true 이고 반복문을 빠져 나오면서 스레드는 종료된다
  • 인터럽트 상태는 계속 유지 된다

InterruptedException #

  • 대기 중인 스레드에 interrupt() 하게 되면 InterruptedException 예외가 발생한다. 이 예외 구문에서 종료기능을 구현할 수 있다

img_4.png

  • 인터럽트가 발생하면 InterruptedException 예외가 발생하고 예외 구문에서 반복문을 빠져 나오면서 스레드는 종료된다
  • 인터럽트 상태는 해제 된다

img_5.png

  • 인터럽트가 발생하면 강제로 InterruptedException 예외를 던지고 예외 구문에서 반복문을 빠져 나오면서 스레드는 종료된다
  • 인터럽트 상태는 해제 된다