자바 라이브러리에 포함되어있는 여러 블러킹 메서드는 대부분 인터럽트 발생 즉시 InterruptedException을 던지며 리턴하지만, 모든 메서드가 그러는 건 아님. 다음의 작업들은 인터럽트를 걸어도 블러킹에서 깨어나오지 않음.

따라서 해당 스레드가 블러킹 되어있는 이유를 판단하여 작업을 중단해야함

java.io 패키지의 동기적 소켓 I/O

InputStream.read()와 OutputStream.write() 메서드가 인터럽트에 반응하지 않는다.

해당 스트림이 연결된 소켓을 직접 닫아버리면 read와 write 메서드가 SocketException을 던지며 깨어남

java.nio 패키지의 동기적 I/O

InterruptibleChannel에서 대기하고 있는 스레드에 인터럽트를 걸면 ClosedByInterruptExcetion을 던지며 해당 채널이 닫힌다.

해당 채널에서 대기하고 있는 모든 스레드에 ClosedByInterruptExcetion가 발생한다.

Selector를 사용한 비동기적 I/O

스레드가 Selector.select() 메서드에서 블러킹 되어있는 경우, close 메서드를 호출하면 ClosedSelectorExcetpion을 던지며 깨어남

락 확보 작업

스레드가 암묵적인 락을 확보하기 위해 대기 상태에 들어가 있는 경우 락을 언제 확보할 지 알수 없을 뿐더러, 어찌 할 방법이 없다.

Lock 인터페이스를 사용하여 명시적인 락을 사용하면 인터럽트에 스레드가 깨어남