只要有非deamon线程在运行,jvm就不会自动退出。比如main线程也是非deamon线程,如果一个程序中只要main,和deamon线程,假设deamon线程死循环打印一字符串,这是如果main线程结束,则deamon线程也将自动消亡!因为jvm退出了!
下面是测试实例
package test;
import java.io.IOException;
import java.io.InputStream;
public class DeamonTest implements Runnable
{
int i=0;
@Override
public void run()
{
for(;;)
{
System.out.println("time at "+i++);
try
{
Thread.sleep(1000);
}
catch (InterruptedException e)
{
e.printStackTrace();
}
}
}
public static void main(String[] arg) throws IOException
{
Thread deamon=new Thread(new DeamonTest());
deamon.setDaemon(true);
deamon.start();
InputStream in=System.in;
byte[] data=new byte[1024*1024];
System.out.println("please input a string to end the main thread....");
int count=in.read(data);
byte[] read=new byte[count];
System.arraycopy(data, 0, read, 0, count);
System.out.println(new String(read));
Runtime.getRuntime().addShutdownHook(new Thread(){
public void run()
{
System.out.println("jvm exit!");
}
});
}
}
运行后,用debug可以观察到此时main线程和deamon线程正在运行。如图
当,输入一个字符串时,这时main线程结束,deamon线程也随即结束