类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");
}
}
为什么第二个终于方法不运行...因为我知道最后方法必须要运行任何条件..但在这种情况下只有第一个最终方法,为什么不第二个最终运行。
答案 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退出,因为该线程是守护进程,会自动优雅地退出循环。事实并非如此。守护程序线程只是死(在当前执行的代码中的位置)