在看ThinkInJava,验证其中的一则代码,发现其在Java6或者Java8下都是正确的,但是在Java7下却出现了异常,代码如下:packagecom.mobile.concurrency;importjava.util.concurrent.TimeUnit;classADaemonimplementsRunnable{@Overridepublicvoidrun(){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下面多测试几次也还是会出现能打印出来的情况
2 回答
Helenr
TA贡献1780条经验 获得超3个赞
我觉得可能的原因。因为主线程和你新开的线程运行的顺序并不是确定的,当新的线程要输出的时候,你的main线程可能已经退出了。由于你setDaemon(true)Marksthisthreadaseitheradaemonthreadorauserthread.TheJavaVirtualMachineexitswhentheonlythreadsrunningarealldaemonthreads.这样就算你还有一个daemon线程,jvm也会退出,因为没有普通的线程在运行,这样可能导致你的daemon线程中的printf没有输出内容。
慕尼黑的夜晚无繁华
TA贡献1864条经验 获得超6个赞
因为你setDaemon(true)了啊,你这段代码执行main方法的时候就剩下守护线程了,JVM在这种情况下可能选择直接退出所以并不保证会执行完守护线程。
添加回答
举报
0/150
提交
取消