大可制作:QQ群:31564239(asp|jsp|php|mysql)

Java Gossip: Daemon 线程

您想要设计一个程序,除了主线程之外,其运用了一个线程于背景进行相关运算工作,您的程序可能像是这样:
  • SimpleThread.java
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执行 绪,下面这个程序是个简单的示范:

  • DaemonTest.java
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线程,这很直觉,由一个背景服务线程衍生出来的线程,也应该是为了在背 景服务而产生的,所以在该停止时也应该停止。