Java测试守护线程的一段程序在Java7下失效

在看ThinkInJava,验证其中的一则代码,发现其在Java6或者Java8下都是正确的,但是在Java7下却出现了异常,代码如下:
packagecom.mobile.concurrency;
importjava.util.concurrent.TimeUnit;
classADaemonimplementsRunnable{
@Override
publicvoidrun(){
try{
System.out.println("startingdaemon");
TimeUnit.SECONDS.sleep(1);
}catch(InterruptedExceptione){
e.printStackTrace();
}finally{
System.out.println("Thisshouldalwaysrun");
}
}
}
publicclassDaemonsDontRunFinally{
publicstaticvoidmain(String[]args){
Threadt=newThread(newADaemon());
t.setDaemon(true);
t.start();
//System.out.println(":");
}
}
在java6,8下面都能输出startingdaemon,但是java7却是什么都不输出,当我在main里加入输出部分才输出startingdaemon.
不太了解这部分知识,求指教,谢谢
=====update===
多测试了几次之后发现也并不是Java版本的问题,在7下面多测试几次也还是会出现能打印出来的情况
慕尼黑8549860
浏览 313回答 2
2回答

Helenr

我觉得可能的原因。因为主线程和你新开的线程运行的顺序并不是确定的,当新的线程要输出的时候,你的main线程可能已经退出了。由于你setDaemon(true)Marksthisthreadaseitheradaemonthreadorauserthread.TheJavaVirtualMachineexitswhentheonlythreadsrunningarealldaemonthreads.这样就算你还有一个daemon线程,jvm也会退出,因为没有普通的线程在运行,这样可能导致你的daemon线程中的printf没有输出内容。

慕尼黑的夜晚无繁华

因为你setDaemon(true)了啊,你这段代码执行main方法的时候就剩下守护线程了,JVM在这种情况下可能选择直接退出所以并不保证会执行完守护线程。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript