您想要设计一个程序,除了主执行绪之外,其运用了一个执行绪于背景进行相关运算工作,您的程序可能像是这样:
package onlyfun.caterpillar; public class SimpleThread { public static void main(String[] args) { Thread thread = new Thread(new Runnable() { public void run() { while(true) { System.out.print("T"); } } }); thread.start(); // 主执行绪继续进行其它工作........ // such...such.... // 现在主执行绪执行到这边了,工作应该结束了 } }
您的执行绪已经运行到最后一个陈述了,这时应该是工作结束的时候,但您的另一个执行绪还在运作,您怎么停止它?在最后加上一行使用System.exit ()?这虽然也可以,但这只是强迫程序结束,而且这个方法并不是随时可以适用!
一个Daemon执行绪是一个在背景执行服务的执行绪,例如网络服务器倾听连接端口的服务、隐藏的系统执行绪如垃圾收集执行绪或其它JVM 建立的执行绪,如果所有的非Daemon的执行绪都结束了,则Daemon执行绪自动就会终止。
从Main函式开始的是一个非Daemon执行绪,如果您希望某个执行绪在非Daemon执行绪都结束后也跟着终止,那么您要将它设定为Daemon执行 绪,下面这个程序是个简单的示范:
package onlyfun.caterpillar; public class DaemonTest { public static void main(String[] args) { Thread thread = new Thread(new Runnable() { public void run() { while(true) { System.out.print("T"); } }? }); thread.setDaemon(true); thread.start(); } }
这个程序在主执行绪结束之后,Daemon也就跟着结束了,所以它不会像上面这个程序,不断的打印T字符;您可以使用setDaemon()方法来设定一 个执行绪是否为Daemon执行绪,使用isDaemon()方法则可以判断该执行绪是否为Daemon执行绪。
基本上,Java预设所有从Daemon执行绪产生的执行绪也是Daemon执行绪,这很直觉,由一个背景服务执行绪衍生出来的执行绪,也应该是为了在背 景服务而产生的,所以在该停止时也应该停止。