2013-08-14 2 views
5

많은 스레드를 생성 한 주 스레드가 하나 있습니다. 모든 스레드는 스레드입니다.Java 멀티 스레딩 오류 처리

일부 작업자에 예외가 있거나 작업자를 성공적으로 종료 할 수없는 경우 주 스레드의 작업자로부터 오류를 어떻게받을 수 있습니까?

작업자 스레드가 죽기 전에 오류를 보내는 방법은 무엇입니까? 이를 달성하기

+3

당신은 ['Callable'] 봐 (http://docs.oracle.com/javase/7/docs/api/java를 취해야한다 /util/concurrent/Callable.html) 및 ['Future'] (http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/Future.html)를 참조하십시오. ['UncaughtExceptionHandler'] (http://docs.oracle.com/javase/7/docs/api/java/lang/Thread.UncaughtExceptionHandler.html)를 사용할 수도 있지만, 조금 더러웠다 고 생각합니다. .. 자신의 콜백 메커니즘을 설정할 수도 있습니다. – MadProgrammer

+0

http://stackoverflow.com/questions/2248131/handling-exceptions-from-java-executorservice-tasks?rq=1 – Olga

+0

futurecallback 인터페이스에 대해 알고 계십니까? http://stackoverflow.com/questions/18227173/java-multithreaded-programming-using-with-guava-futurecallback-interface? – prilia

답변

3

당신이 java.util.concurrent의 실행 프로그램 프레임 워크를 사용하고 발생하는 경우 제출 된 각 작업자의 미래, 미래에 대해 get()을 호출하면 작업자의 결과 또는 해당 작업자 내에서 던져 지거나 잡히는 예외가 제공됩니다.

0

한가지 방법은 스레드 전달 신호를 사용한다. 신호 전달은 서로 통신하기 위해 스레드가 필요할 때 광범위하게 사용됩니다. 이를 달성하는 간단한 방법은 스레드 간의 공유 객체에 액세스하고 객체의 값 (신호 표시)을 모니터하는 것입니다. 다른 스레드가 적절한 조치를 취할 수 있도록 오류을 나타내는 객체에 값을 할당 할 수 있습니다 (신호 형식). , 만 고장 신호하지만 다양한 상태 신호뿐만 의해 공유 객체에 적절한 설정 값을 통과 할 수없는 신호를 이용
는 (스레드의 상태를 나타내는 다른 값으로 열거 말한다).
은 자세한 내용은이 링크를 참조하십시오 http://tutorials.jenkov.com/java-concurrency/thread-signaling.html

2
당신은 모든 스레드의 모든 캐치되지 않는 예외를 가로 챌 것이다 글로벌 있던 uncaughtExceptionHandler 설정할 수 있습니다

Thread.setDefaultUncaughtExceptionHandler(new UncaughtExceptionHandler() { 
    @Override 
    public void uncaughtException(Thread t, Throwable e) { 
     ... 
    } 
});