package util;
import java.util.Scanner;
import java.util.Timer;
import java.util.TimerTask;
public class TimerTest {
public static void main(String []args){
Timer timer = new Timer(true);//定时器
TimerTask timerTask = new TimerTask(){//定时器任务
@Override
public void run() {
// TODO Auto-generated method stub
System.out.println("aaaa");
}
};
timer.schedule(timerTask, 0,5*1000);
Thread deamonThread = new Thread(new DeamonThread());
deamonThread.setDaemon(true);//设置该线程为守护线程
deamonThread.start();
Scanner sca = new Scanner(System.in);
String next = sca.next();
System.out.println(next);
if(next != null && next.equals("12")){//当用户在console输入12时 退出
//在jvm退出的时候做一些操作
Runtime.getRuntime().addShutdownHook(
new Thread(){
@Override
public void run() {
// TODO Auto-generated method stub
System.out.println("JVM Exit!");
}
});
}
}
}
//守护线程
class DeamonThread implements Runnable{
@Override
public void run() {
// TODO Auto-generated method stub
while(true){
System.out.println("这是时间处理线程");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
class TimerThread implements Runnable{
当jvm中只剩下守护线程,则jvm退出
在上面的代码中,deamonthread是一个守护线程(setDeamon(true)),设置一个线程为守护线程,那么使用setDeamon方法判断。
因为是守护线程,那么在上面的代码执行中,如果用户输入数据,回车了那么用户主线程结束,此时虽然deamonthread线程是死循环,
但是此时jvm中只剩下守护线程,所以jvm会退出,deamonthread结束。
如果将deamonthread改为用户线程,即setDeamon(false),此时deamonthread是用户线程,那么用户在console输入数据只要不是“12”,则jvm不会退出。
这是什么原因呢,因为deamonthread是用户线程,此时jvm中还存在用户线程,所以在正常情况下,jvm不会退出,那么deamonthread会一直执行。