1

クラスDaemonThreadはThread{を拡張します

public void run() {
    System.out.println("Entering run method");

    try {
        System.out.println("In run Method: currentThread() is"
            + Thread.currentThread());

        while (true) {
            try {
                Thread.sleep(500);
            } catch (InterruptedException x) {
                System.out.println("hi");
            }

            // System.out.println("In run method: woke up again");

            finally {
                System.out.println("Leaving run1 Method");
            }
        }
    } finally {
        System.out.println("Leaving run Method");
    }

}

public static void main(String[] args) {
    System.out.println("Entering main Method");

    DaemonThread t = new DaemonThread();
    t.setDaemon(true);
    t.start();

    try {
        Thread.sleep(900);
    } catch (InterruptedException x) {}

    System.out.println("Leaving main method");
}

}

なぜ2番目のfinallyメソッドが実行されないのか...私が知っているように、finallyメソッドは条件が何であれ実行する必要があります。

4

5 に答える 5

6

決して終わらないループのため、printlnステートメントに到達することはありません!while(true)

そのループを抜けると、2 番目のfinallyブロックが実行されます。

于 2012-05-21T07:06:48.837 に答える
2

理論的には 2 番目の finally メソッドを実行する必要がありますが、これは決して終了しない while(true) ループの外にあるため、アクセスできません。

于 2012-05-21T07:10:37.503 に答える
0

コードは、whileループが終了しないことを示しています。finallyしたがって、外側のブロックに到達する問題はありません。

他の条件を使用するだけで、達成したいことが得られる場合があります。例えば:

public void run() {
    System.out.println("Entering run method");
    int flag = 1;
    try {
        System.out.println("In run Method: currentThread() is"
            + Thread.currentThread());

        while (flag == 1) {
            try {
                Thread.sleep(500);
                 flag = 0;
            } catch (InterruptedException x) {
                System.out.println("hi");
            }

            // System.out.println("In run method: woke up again");

            finally {
                System.out.println("Leaving run1 Method");
            }
        }
    } finally {
        System.out.println("Leaving run Method");
    }

}
于 2012-05-21T07:08:50.677 に答える
0

while ループは常に TRUE であるため、finally ブロックを実行することはありません。また、Java コメントから

"if the thread executing the try or catch code is interrupted or killed, the finally block may not execute even though the application as a whole continues."
于 2012-05-21T07:09:59.317 に答える
0

スレッドがデーモンであるため、JVM の終了時に、自動的にループを正常に終了することを期待していると思います。そうではありません。デーモンスレッドは単純に終了します (現在実行中のコードの位置で)

于 2012-05-21T07:12:06.133 に答える