2011-04-11 6 views
1
public class Threads2 implements Runnable { 

    public void run() { 
     System.out.println("run."); 
     throw new RuntimeException("Problem"); 
    } 

    public static void main(String[] args) { 
     Thread t = new Thread(new Threads2()); 
     t.start(); 
     System.out.println("End of method."); 
    } 
} 

출력을SCJP : 잡히지 않은 예외 후에 프로그램이 종료되지 않습니다.

run. 
//exception 

로 예측했습니다. 그러나 출력이

run 
exception 
end of method 
run 
exception 
end of method 

(또는)

run 
end of method 
exception 

로 표시됩니다. 예외가 발생하면 끝낼거야, 그렇지?

답변

3

아니요, 프로그램은 종료되지 않지만 스레드는 않습니다.

스레드가 포착되지 않은 예외를 throw하면 종료됩니다. main 스레드가 계속 실행 중입니다.

0

직접 확인하십시오. 내 컴퓨터에 다음과 같이 표시됩니다.

[email protected]:~/workspace/sandbox$ java Threads2 
End of method. 
run. 
Exception in thread "Thread-0" java.lang.RuntimeException: Problem 
    at Threads2.run(Threads2.java:5) 
    at java.lang.Thread.run(Thread.java:636) 
0

이것은 멀티 스레딩의 아름다움입니다!

작성한 모든 자바 프로그램에는 일반적으로 메인 스레드 인 스레드가 실행됩니다. 귀하의 경우 부모 스레드가 주 스레드 인 자신의 스레드를 만들었습니다. 자식 스레드가 예외를 throw하면 종료되지만 주 스레드는 여전히 완료되지 않습니다. 그래서 그것은 마지막 문장이며 그 다음에 끝납니다.

스레드의 경우 [실행 가능 풀에서 항목을 선택하는 JVM의 정책에 따라] 동작을 예측할 수 없으므로 표시되는 순서가 실행마다 다를 수 있습니다.

0

질문을 보는 경우 명시 적으로 스레드를 생성하고 있습니다. main 메소드를 실행하면 jvm이 main 클래스의 쓰레드를 생성합니다. 이는 코드에 두 개의 스레드가 있음을 의미합니다. 하나는 t이고 다른 하나는 메인 클래스 스레드입니다. 여기서 main() 쓰레드는 부모 쓰레드이고 t 쓰레드는 자식 쓰레드입니다. 예외가 자식 스레드에서 발생하므로 종료되고 부모 스레드가 실행됩니다. 따라서 출력은 순서 중 하나 일 수 있습니다.

감사합니다, 제임스

1

우선, 당신이있어 출력이 마지막이 아니다. 멀티 스레딩의 경우 시스템에 따라 다릅니다. 다른 기계에서 출력이 달라질 수 있습니다.

예외가 발생하면 실행중인 스레드 실행이 종료됩니다. 다른 스레드는 실행을 계속합니다.

-1

프로그램이 아니지만 스레드가 종료됩니다. 주 프로그램은 계속 실행됩니다.

관련 문제