Java 병렬 프로그래밍 예시 (8): 스레드의 비검사 예외 처리
검사 이상: 이런 이상은 반드시 throws 자구에서 현식으로 던져지거나 방법 내에서 포획되어야 합니다.예를 들어, IOException 예외 또는 ClassNotFoundException 예외입니다.
검사되지 않은 이상: 이런 이상은 현식 투매나 포획이 필요하지 않습니다.예를 들어, NumberFormatException 예외입니다.
검사된 이상이 Thread 대상의run () 방법에서 던져졌을 때, 우리는 그것을 포착하고 처리해야 한다. 왜냐하면 run () 방법은 이상을 던질 수 없기 때문이다.검사되지 않은 이상이 Thread 대상의run () 방법에서 던져졌을 때, 기본 동작은 컨트롤러에서 창고 추적 정보를 출력하고 프로그램을 종료하는 것입니다.
다행히도 Java는 프로그램의 종료를 피하기 위해 Thread 대상이 던진 비검사 이상을 처리하는 메커니즘을 제공합니다.
이 절에서 우리는 예시로 이런 메커니즘을 보여 준다.
그 사실을 알다
아래와 같은 절차에 따라 우리의 예시를 실현하다.
1. 우선, 우리는 검사를 받지 않은 이상을 처리하는 데 사용되는 종류를 실현해야 한다.이 클래스는 반드시 Uncaught Exception Handler 클래스를 실현하고 이 인터페이스에서 설명한 uncaught Exception () 방법을 실현해야 한다.이 예에서 이 클래스는 ExceptionHandler, uncaught Exception () 방법으로 이상과 이상한 스레드 정보를 출력합니다.코드는 다음과 같습니다.
public class ExceptionHandler implements Thread.UncaughtExceptionHandler {
@Override
public void uncaughtException(Thread t, Throwable e) {
System.out.printf("An exception has been captured\
");
System.out.printf("Thread: %s
", t.getId());
System.out.printf("Exception: %s: %s
", e.getClass().getName(),
e.getMessage());
System.out.printf("Stack Trace:
");
e.printStackTrace(System.out);
System.out.printf("Thread status: %s
", t.getState());
}
}
2. 검사되지 않은 이상을 던질 수 있는 클래스를 Task라고 하고 Runnable 인터페이스를 실현하며run() 방법을 실현한다. 일부러 검사되지 않은 이상을 일으킬 수 있는 코드를 인코딩한다. 예를 들어 문자열을 숫자로 변환한다.코드는 다음과 같습니다.
public class Task implements Runnable {
@Override
public void run() {
int numero = Integer.parseInt("diguage.com");
}
}
3. 프로그램의 메인 클래스, 메인 클래스를 만들고 메인 () 방법을 실현합니다.코드는 다음과 같습니다.
public class Main {
public static void main(String[] args) {
4. Task 객체를 만들고 Thread 객체를 작성합니다.setUncaughtExceptionHandler() 방법을 사용하여 검사되지 않은 비정상적인 처리 클래스를 설정합니다.그리고 라인을 시작합니다.코드는 다음과 같습니다.
Task task = new Task();
Thread thread = new Thread(task);
thread.setUncaughtExceptionHandler(new ExceptionHandler());
thread.start();
5. 예시를 실행하고 결과를 봅니다.그 까닭을 알다
아래의 출력 부분에서 이상 실행 결과를 볼 수 있습니다.이상이 던져지고 처리 클래스에 포착되어 이상 정보를 컨트롤러에 출력합니다.
An exception has been captured
Thread: 9
Exception: java.lang.NumberFormatException: For input string: "diguage.com"
Stack Trace:
java.lang.NumberFormatException: For input string: "diguage.com"
at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
at java.lang.Integer.parseInt(Integer.java:492)
at java.lang.Integer.parseInt(Integer.java:527)
at com.diguage.books.concurrencycookbook.chapter1.recipe8.Task.run(Task.java:13)
at java.lang.Thread.run(Thread.java:722)
Thread status: RUNNABLE
Process finished with exit code 0
하나의 스레드가 이상을 던지고 이 이상(여기는 특별히 검사를 받지 않는 이상을 가리킨다)이 포착되지 않았을 때 자바 가상 기회는 상응하는 방법으로 검사를 받지 않는 이상 처리 클래스를 설정했는지 확인하고, 이미 설정된 경우 uncaught Exception () 방법을 호출하여 스레드와 이상을 매개 변수로 전달합니다.처리 클래스를 설정하지 않으면 Java 가상 머신이 콘솔에서 스택 추적 정보를 출력하고 프로그램을 종료합니다.
영원히 끝이 없다
Thread 클래스는 검사되지 않은 이상 처리와 관련된 방법이 하나 더 있습니다.이것이 바로 정적 방법setDefaultUncaught ExceptionHandler () 입니다. 이 방법은 프로그램의 모든 스레드에서 검사되지 않은 비정상적인 처리 클래스를 설정할 수 있습니다.
스레드에서 포착되지 않은 예외가 발생하면 Java 가상 기회는 세 곳에서 예외 처리 클래스를 찾습니다.
우선, 루틴 대상에서 이상 처리 종류를 찾는 것이 바로 우리 절에서 배운 내용이다.존재하지 않으면 스레드가 있는 스레드 그룹(Thread Group)에서 이상 처리 클래스를 찾습니다.이 부분의 내용에 관해서는 나중에 전문적으로 설명할 것이다.만약 존재하지 않는다면, 위에서 언급한 프로그램의 기본 이상 처리 클래스를 찾습니다.
위에서 언급한 이상 처리가 존재하지 않으면 Java 가상 시스템은 이상한 스택 추적 정보를 컨트롤러에 출력하고 프로그램을 종료합니다.
나래주의
본고는 《Java7 Concurrency Cookbook》(D 오이고에서 《Java7 병발 예시집》으로 번역)에서 번역한 것으로 학습 자료로만 사용된다.권한이 없으면 어떠한 상업 행위에도 사용할 수 없다.
소소하다
ExceptionHandler 클래스의 전체 코드
package com.diguage.books.concurrencycookbook.chapter1.recipe8;
/**
*
* Date: 2013-09-22
* Time: 23:11
*/
public class ExceptionHandler implements Thread.UncaughtExceptionHandler {
@Override
public void uncaughtException(Thread t, Throwable e) {
System.out.printf("An exception has been captured
");
System.out.printf("Thread: %s
", t.getId());
System.out.printf("Exception: %s: %s
", e.getClass().getName(),
e.getMessage());
System.out.printf("Stack Trace:
");
e.printStackTrace(System.out);
System.out.printf("Thread status: %s
", t.getState());
}
}
Task 클래스의 전체 코드
package com.diguage.books.concurrencycookbook.chapter1.recipe8;
/**
*
* Date: 2013-09-22
* Time: 23:18
*/
public class Task implements Runnable {
@Override
public void run() {
int numero = Integer.parseInt("diguage.com");
}
}
Main 클래스의 전체 코드
package com.diguage.books.concurrencycookbook.chapter1.recipe8;
/**
*
* Date: 2013-09-22
* Time: 23:20
*/
public class Main {
public static void main(String[] args) {
Task task = new Task();
Thread thread = new Thread(task);
thread.setUncaughtExceptionHandler(new ExceptionHandler());
thread.start();
}
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
JPA + QueryDSL 계층형 댓글, 대댓글 구현(2)이번엔 전편에 이어서 계층형 댓글, 대댓글을 다시 리팩토링해볼 예정이다. 이전 게시글에서는 계층형 댓글, 대댓글을 구현은 되었지만 N+1 문제가 있었다. 이번에는 그 N+1 문제를 해결해 볼 것이다. 위의 로직은 이...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.