java问题
 悬赏分:0 - 离问题结束还有 14 天 22 小时 
public class ThreadPrint{static Thread makeThread(final String id,boolean doemon)
 {Thread t=new Thread(id){public void run(){
System.out.println(id);
}
};
t.setDaemon(daemon);
t.start();
return t;}
public static void main(String args[])Thread a=makeThread("A",false);
Thread b=makeThread("B",true);
System.out.println("END,\n");}
选择正确的答案:
a.总是打印字符A
b.总打印字符B
c.从不在END之后打印A
d.从不在END之后打印B
e.程序可能依次打印B  END和A,
请问这题为什么是选择a ,e呢,我有点不怎么理解麻烦大家解释下

解决方案 »

  1.   

    当所有的非daemon线程退出后,整个进程也就退出了。
    打印A的线程是非daemon的,所以,A是肯定会被打印出来的,a是对的。
    B不一定有机会被打印,那要看它是否在主线程和打印A的线程退出之前能获得调度运行的机会。所以b不对。
    c和d也不一定,实际的线程调度次序和运行情况是很难预测的,一切皆有可能。
    e当然是对的,因为它说“可能”,当调度器依次调度打印B的线程、主线程和打印A的线程上台运行时,自然就是这种结果。
      

  2.   

    很正确,记住所有的非不明白A,为什么不打印,主线程的,主线程的不退出,后台线程也肯定不会退出的,怎么会只打印一个非daemon线程结束后,不管daemon线程又没有执行,都会强制挂掉daemon线程的,还有线程调度的事情谁也说不准,不要尝试去断言这个