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.");
    }
}

私は出力を次のように予測しました

run.
//exception

しかし、出力は次のように表示されます。

run
exception
end of method

(また)

run
end of method
exception

例外が発生すると、プログラムは終了するのではないでしょうか。

4

6 に答える 6

3

いいえ、プログラムは終了しませんが、スレッドは終了します。

スレッドがキャッチされない例外をスローすると、スレッドは終了します。スレッドmainは実行を継続します。

于 2011-04-11T14:11:01.187 に答える
1

まず、得られた出力は最終的なものではありません。マルチスレッドの場合はマシンによって異なります。別のマシンでは、いくつかの異なる出力が来る可能性があります。

例外として、実行中のスレッドの実行は終了します。他のスレッドは実行を継続します。

于 2013-09-24T08:39:59.000 に答える
0

自分で見て。私のマシンでは、次のようになります。

bartek@dragon:~/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)
于 2011-04-11T13:57:39.720 に答える
0

これがマルチスレッドの美しさです!!

あなたが書くすべてのJavaプログラムには、通常はメインスレッドであるそれを実行するスレッドがあります。あなたの場合、親スレッドがメインスレッドである独自のスレッドを作成しました。子スレッドが例外をスローすると、例外は終了しますが、メインスレッドはまだ完了していません。つまり、最後のステートメントを出力してから終了します。

スレッドの場合、動作は予測できません[実行可能なプールからアイテムを選択するのはJVMのポリシーに依存するため]。そのため、実行ごとに表示される順序が異なる場合があります。

于 2013-01-16T18:40:32.123 に答える
0

質問を観察すると、スレッドtを明示的に作成しています。コードを実行すると、mainメソッドが実行され、ここでjvmはメインクラスのスレッドも作成します。つまり、コードには2つのスレッドがあります。1つはtで、もう1つはメインクラスのスレッドです。ここで、main()スレッドは親スレッドであり、tスレッドは子スレッドです。子スレッドで例外が発生すると、例外が終了し、親スレッドが実行されます。したがって、出力は任意の順序になる可能性があります。

よろしく、ジェームズ

于 2013-05-14T13:09:12.533 に答える
-1

プログラムではなく、スレッドが終了します。メインプログラムは実行を継続します。

于 2013-10-03T09:13:37.133 に答える