最后用java中的try方法

时间:2012-05-21 07:04:02

标签: java

类DaemonThread扩展了线程{

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

}

为什么第二个终于方法不运行...因为我知道最后方法必须要运行任何条件..但在这种情况下只有第一个最终方法,为什么不第二个最终运行。

5 个答案:

答案 0 :(得分:6)

永远不会达到println语句,因为while(true)循环永远不会结束!

如果您离开该循环,则将执行第二个finally块。

答案 1 :(得分:2)

理论上它应该运行第二个finally方法,但由于它不在while(true)循环中,它永远不会结束,因此无法访问它。

答案 2 :(得分: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");
    }

}

答案 3 :(得分:0)

它永远不会执行finally块,因为while循环始终为TRUE。此外,来自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."

答案 4 :(得分:0)

我猜你期望在JVM退出,因为该线程是守护进程,会自动优雅地退出循环。事实并非如此。守护程序线程只是死(在当前执行的代码中的位置)