인터럽트 방식
인터럽트는 문자 그대로 인터럽트를 의미하지만, Java에서는 Thread.interrupt() 메서드가 실제로 어떤 방식으로든 스레드에 알리고 스레드를 직접 종료하지 않습니다. 무엇을 할지 결정하는 것은 코드를 작성한 사람에게 달려 있으며 일반적으로 스레드를 중단합니다.
스레드가 Object 클래스의 wait(), wait(long) 또는 wait(long, int) 메서드를 호출하는 경우, Join(), Join(long), Join(long, int), sleep(long) 또는 메서드가 진행되는 동안 클래스(long, int)의 절전 모드가 차단되고 해당 인터럽트 상태가 지워지며 InterruptedException도 수신됩니다.
스레드가 인터럽트 가능한 채널(java.nio.channels.InterruptibleChannel)에서 I/O 작업을 차단하는 경우 채널이 닫히고 스레드의 인터럽트 상태가 설정되며 스레드는 ClosedByInterruptException을 수신합니다.
스레드가 선택기(java.nio.channels.Selector)에서 차단된 경우 스레드의 인터럽트 상태가 설정되고 select가 호출된 것처럼 0이 아닌 값으로 선택 작업에서 즉시 반환됩니다. 장치의 방법은 동일합니다.
이전 조건 중 어느 것도 저장되지 않은 경우 스레드의 인터럽트 상태가 설정됩니다.
비활성 스레드를 중단해도 아무런 효과가 없습니다.
인터럽트 감지
인터럽트가 감지되는 방법은 스레드가 수행하는 작업에 따라 다릅니다.
스레드가 InterruptException을 발생시킬 수 있는 메서드를 호출하는 경우 InterruptException을 포착한 다음 이를 catch 블록에서 처리합니다(일반적으로 스레드를 중단하기 위해 run 메서드를 종료합니다).
다른 메소드를 호출하는 경우에는 유휴 상태일 때 Thread.interrupted를 확인하여 인터럽트 신호가 수신되는지 확인하고, 인터럽트 신호가 수신되는지 확인한 후 처리할 수 있습니다. 이전 처리 방법과 일관성을 유지하기 위해 InterruptException이 발생할 수 있습니다.
인터럽트 상태
스레드의 인터럽트 메커니즘은 인터럽트 상태의 내부 플래그를 사용하여 구현됩니다. 인터럽트 상태는 스레드의 Interrupt() 메서드가 호출될 때 설정됩니다(위의 인터럽트 메서드 설명 참조).
스레드의 인터럽트 상태를 얻는 방법에는 두 가지가 있습니다.
정적 메서드 Thread.interrupted()를 호출하면 이 메서드는 현재 스레드의 인터럽트 상태를 반환하는 것 외에도 현재 스레드의 인터럽트 상태도 지웁니다. 즉, 이 메서드가 연속해서 두 번 호출되면 두 번째 호출은 false를 반환합니다(첫 번째 호출이 중단 상태를 지운 후, 두 번째 호출이 중단 상태를 확인하기 전에 현재 스레드가 다시 중단됩니다. 예외) ).
지정된 스레드의 isInterrupted() 메서드를 호출합니다. 이 메서드는 스레드의 인터럽트 상태에 영향을 주지 않고 지정된 스레드의 인터럽트 상태만 반환합니다.
스레드의 인터럽트 상태를 지우는 방법에는 두 가지가 있습니다.
위에서 언급했듯이 Thread.interrupted()를 호출합니다.
InterruptedException을 발생시키기 위해 스레드의 Interrupt() 메소드를 호출하면 Object의 wait(), wait(long) 또는 wait(long, int) 메소드를 포함하여 스레드의 인터럽트 상태가 동시에 지워집니다. 클래스 또는 스레드의 Join() , Join(long) , Join(long, int) , sleep(long) 또는 sleep(long, int) 메소드