Daemon名字:守护线程,是运行于后台的线程。
jvm中如果只有daemon线程的之后,将会停止线程并退出jvm。
1、使用setDaemon将线程设置为守护线程。
2、需要在start方法调用之前使用。
3、主线程结束后,用户线程将会继续运行,如果没有用户线程,都是后台进程的话,那么jvm结束【daemon线程也结束】。
4、如果是一个Daemon线程,那么它创建的任何线程也会自动具备Daemon属性。
import java.io.IOException;
public class DaemonThreadTest extends Thread {
public DaemonThreadTest() {
}
public void run() {
for (int i = 1; i <= 100; i++) {
try {
Thread.sleep(100);
} catch (InterruptedException ex) {
ex.printStackTrace();
}
System.out.println(i);
}
}
public static void main(String[] args) {
DaemonThreadTest test = new DaemonThreadTest();
// 如果不设置daemon,那么线程将输出100后才结束
// 在test未结束前,执行下面的输入操作,则test终止执行,因为jvm中只剩下守护线程时会终止
test.setDaemon(true);
test.start();
System.out.println("isDaemon = " + test.isDaemon());
try {
System.in.read(); // 接受输入,使程序在此停顿,一旦接收到用户输入,main线程结束,守护线程自动结束
} catch (IOException ex) {
ex.printStackTrace();
}
System.out.print(Thread.currentThread().getName() + "结束");
}
}
上面代码中,一旦用户输入内容敲击回车之后,daemon线程也会立即停止。
在java中,很多地方需要用到守护线程。比如说gc中,回收垃圾的线程就是守护线程。