[인터럽트]

Walter Mitty·2024년 11월 20일
0

개인공부

목록 보기
41/41

인터럽트

특정 스레드의 작업을 중단하는 가장 쉬운 방법은 변수를 사용하는 것인데, volatile boolean runFlag = true 값으로 work 스레드에 대한 작업 중단을 지시한다고 하자.
하나의 작업에 3초가 걸린다고 가정하고 sleep(3000)을 지정하고 실행시키면 main 스레드가 runFlag=false를 통해 작업 중단을 지시해도, work 스레드가 즉각 반응하고 중단되지 않고 2초 정도 후에 중단이 된다.

인터럽트 사용

만약 특정 스레드가 Thread.sleep()을 통해 쉬고 있는데, 처리해야하는 작업이 들어와서 해당 스레드를 급하게 깨워야 하거나, sleep()상태로 쉬고있는 스레드에게 작업 종료를 지시할 수 있다.

  • 인터럽트를 사용하면, WAITING, TIMED_WAITING 같은 대기 상태의 스레드를 직접 깨워서 작동하는 `RUNNABLE 상태로 만들 수 있다.

흐름
1. 특정 스레드의 인스턴스에 interrupt() 메서드를 호출
2. 해당 스레드에 인터럽트 발생
3. 해당 스레드에 InterruptedException 발생
3-1. 이때 인터럽트를 받은 스레드는 대기 상태에서 깨어나 RUNNABLE 상태가 되고 코드 정상 수행
3-2. InterruptedException은 catch로 잡아서 정상 흐름으로 변경

참고로 스레드가 RUNNABLE 상태여야 catch의 예외 코드도 실행될 수 있다.

자바에서 인터럽트 예외가 한 번 발생하면, 스레드의 인터럽트 상태를 다시 정상(false)으로 돌리는 이유는 스레드의 인터럽트 상태를 정상으로 돌리지 않으면 이후에도 계속 인터럽트가 발생하기 때문이다.
인터럽트 목적을 달성하면 인터럽트 상태를 다시 정상으로 돌려두어야 한다.

Yield - 양보하기

어떤 스레드를 얼마나 실행할지는 운영체제가 스케줄링을 통해 결정.
그런데 특정 스레드가 크게 바쁘지 않은 상황이어서 다른 스레드에 CPU 실행 기회를 양보하고 싶다면, 스케줄링 큐에 대기 중인 다른 스레드가 CPU 실행 기회를 더 빨리 얻을 수 있다.

0개의 댓글