다음 InterruptedException 처리 방법의 차이점은 무엇입니까? 가장 좋은 방법은 무엇입니까?
던지는 메소드를 호출했기 때문에 아마도이 질문을했을 것입니다 InterruptedException
.
우선, throws InterruptedException
그 의미가 무엇인지 알아야합니다. 메소드 서명의 일부 및 호출중인 메소드 호출의 결과. 따라서 InterruptedException
a가 메소드 호출의 완벽한 결과 라는 사실을 받아들이는 것으로 시작 하십시오.
방법 당신이있는 거 호출은 예외가 발생하면 지금, 무엇을해야 당신의 방법은 무엇입니까? 다음에 대해 생각하여 답을 찾을 수 있습니다.
이 방법에 대한 이해 지나요 당신이 을 던져 구현됩니다 InterruptedException
? 다르게 말하면, 메소드를 InterruptedException
호출 할 때 합리적인 결과 입니까?
경우 예 , 다음 throws InterruptedException
의 일부가되어야 당신의 방법 서명, 당신은 (즉, 전혀 그것을 잡을하지 않음) 예외 전파를하도록해야한다.
예제 : 메소드는 네트워크의 값이 계산을 완료하고 결과를 반환하기를 기다립니다. 네트워크 호출 차단이 발생하면 InterruptedException
메소드가 정상적인 방식으로 계산을 완료 할 수 없습니다. 당신은 할 수 InterruptedException
전파를.
int computeSum(Server server) throws InterruptedException {
// Any InterruptedException thrown below is propagated
int a = server.getValueA();
int b = server.getValueB();
return a + b;
}
경우 에는 , 당신은 귀하의 방법을 선언하지해야합니다 throws InterruptedException
그리고 당신은 (필수!) 예외를 catch해야합니다. 이제이 상황에서 두 가지를 명심해야합니다.
누군가 스레드를 중단했습니다. 누군가가 작업을 취소하고 프로그램을 정상적으로 종료하는 등의 일을 원할 수도 있습니다. 당신은 그 사람에게 공손하고 더 이상 고민하지 않고 당신의 방법에서 돌아와야합니다.
비록 당신의 방법은 경우에 합리적인 반환 값을 생성 관리 할 수있는 InterruptedException
스레드가 여전히 중요 할 수 있습니다 중단 된 사실. 특히, 메소드를 호출하는 코드는 메소드 실행 중에 중단이 발생했는지 여부에 관심이있을 수 있습니다. 따라서 중단 된 플래그를 설정하여 중단이 발생했음을 기록해야합니다.Thread.currentThread().interrupt()
예 : 사용자가 두 값의 합계를 인쇄하도록 요청했습니다. Failed to compute sum
합계를 계산할 수없는 경우 " " 인쇄 가 가능합니다 (및로 인해 스택 추적으로 프로그램이 충돌하는 것보다 훨씬 낫습니다 InterruptedException
). 다시 말해, 이 메소드를로 선언하는 것은 의미 가 없습니다throws InterruptedException
.
void printSum(Server server) {
try {
int sum = computeSum(server);
System.out.println("Sum: " + sum);
} catch (InterruptedException e) {
Thread.currentThread().interrupt(); // set interrupt flag
System.out.println("Failed to compute sum");
}
}
이제는 그냥하는 throw new RuntimeException(e)
것이 나쁜 생각 임을 분명히해야합니다 . 발신자에게는 그다지 예의가 없습니다. 새로운 런타임 예외를 만들 수는 있지만 근본 원인 (누군가 스레드가 실행을 중지하도록하려는 경우)이 손실 될 수 있습니다.
다른 예 :
구현Runnable
: 발견했듯이 서명은 다시 Runnable.run
던질 수 없습니다 InterruptedExceptions
. 글쎄, 당신은 구현에 가입 Runnable
하는 것이 어떤 의미, 당신이 할 수와 계약에 서명 InterruptedExceptions
. 와 같은 다른 인터페이스를 선택 Callable
하거나 위의 두 번째 방법을 따르십시오.
호출Thread.sleep
: 파일을 읽으려고하는데 1 초 동안 10 번 시도해야한다고 사양에 명시되어 있습니다. 당신은 전화 Thread.sleep(1000)
. 따라서을 처리해야합니다 InterruptedException
. 같은 방법 tryToReadFile
은, 말을 완벽하게 말이 "나는 중단하고있어, 내가 파일을 읽으려고 내 작업을 완료 할 수 없습니다" . 다시 말해, 메소드가 throw하는 것이 완벽하게 이해됩니다 InterruptedExceptions
.
String tryToReadFile(File f) throws InterruptedException {
for (int i = 0; i < 10; i++) {
if (f.exists())
return readFile(f);
Thread.sleep(1000);
}
return null;
}
이 게시물은 여기 기사로 다시 작성되었습니다 .