스레드 인터럽트 메커니즘은 (협력하는) 스레드가 수행중인 작업을 중지하라는 요청에 응답하는 데 선호되는 방법입니다. 모든 스레드 (내 생각에 스레드 자체 포함)는 스레드를 호출 할 수 interrupt()
있습니다.
실제로,에 대한 일반적인 사용 사례 interrupt()
에는 일종의 프레임 워크 또는 관리자가 작업자 스레드가 수행중인 작업을 중지하도록 지시하는 것이 포함됩니다. 작업자 스레드가 "인터럽트 인식"인 경우 예외를 통해 중단되었거나 중단 된 플래그를 주기적으로 확인하여 중단되었음을 알 수 있습니다. 중단되었음을 알아 차리면 잘 작동하는 스레드가 수행중인 작업을 포기하고 스스로 종료됩니다.
위의 사용 사례를 가정 할 때 코드가 Java 프레임 워크 내에서 실행되거나 일부 작업자 스레드에서 실행되는 경우 코드가 중단 될 수 있습니다. 그리고 그것이 중단 될 때, 당신의 코드는 자신이하는 일을 포기하고 가장 적절한 수단에 의해 스스로 종료되도록해야합니다. 코드가 호출 된 방법에 따라 반환하거나 적절한 예외를 throw하여 수행 할 수 있습니다. 그러나 그것은 아마 호출해서는 안됩니다System.exit()
. (응용 프로그램이 중단 된 이유를 반드시 알 수는 없으며 프레임 워크에 의해 중단되어야하는 다른 스레드가 있는지 확실히 알 수 없습니다.)
반면에 코드가 일부 프레임 워크의 제어하에 실행되도록 설계되지 InterruptedException
않은 경우 예상치 못한 예외 라고 주장 할 수 있습니다 . 즉 버그입니다. 이 경우 다른 버그와 마찬가지로 예외를 처리해야합니다. 예를 들어 확인되지 않은 예외로 래핑하고 다른 예기치 않은 확인되지 않은 예외를 처리하는 동일한 지점에서 포착하고 기록합니다. (또는 응용 프로그램은 단순히 인터럽트를 무시하고 수행중인 작업을 계속할 수 있습니다.)
1) 다른 스레드를 직접 중단하지 않는 경우 InterruptedException을 트리거 할 수있는 것은 무엇입니까?
귀하의 경우 하나의 예는 Runnable
객체가를 사용하여 실행 ExecutorService
및 shutdownNow()
서비스 호출됩니다. 그리고 이론적으로는 타사 스레드 풀 또는 스레드 관리 프레임 워크가 합법적으로 이와 같은 작업을 수행 할 수 있습니다.
2) interrupt () 사용하여 다른 스레드를 중단하지 않는 경우 ... InterruptedException
then은 무엇을 의미합니까? 잡으면 어떻게해야하나요? 내 앱을 종료 하시겠습니까?
코드베이스를 분석하여 무엇이 interrupt()
호출하는 이유와 이유 . 이를 파악한 후에는 >> << 앱의 일부에서 수행해야하는 작업을 해결할 수 있습니다.
왜 InterruptedException
던지는 지 알 때까지 나는 그것을 하드 오류로 취급하는 것이 좋습니다 . 예를 들어 스택 트레이스를 로그 파일에 인쇄하고 앱을 종료합니다. (분명히 이것이 항상 정답은 아닙니다.하지만 요점은 이것이 "버그"이며 개발자 / 관리자의주의를 끌 필요가 있다는 것입니다.)
3) 누구 / 무슨 전화인지 어떻게 알 수 interrupt()
있습니까?
이것에 대한 좋은 대답은 없습니다. 내가 제안 할 수있는 최선의 방법은에 중단 점을 설정 Thread.interrupt()
하고 호출 스택을 보는 것입니다.