java 用户线程与守护线程

来源:互联网 发布:羽绒服清洗剂 知乎 编辑:程序博客网 时间:2024/04/28 08:43

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会一直执行。

0 0
原创粉丝点击