你的位置:首页 > Java教程

[Java教程]java守护线程的理解


  1. package daemonThread;
  2. /*setDaemon(true)方法将线程设置为守护线程,线程的Daemon默认值为false
  3.  * 只要当前JVM实例中存在任何一个非守护线程没有结束,守护线程就在工作
  4.  * 当进程中不存在非守护线程,则守护线程随着JVM一同结束
  5.  * GC(垃圾回收器)就是一个守护线程
  6.  * 本例中main线程虽然先结束,但是testThread线程还在工作,所以只有当testThread线程也结束,才停止打印i */
  7. class MyThread extends Thread{
  8.  private int i = 0;
  9.  @Override
  10.  public void run(){
  11.   super.run();
  12.   try{
  13.    while(true){
  14.     i++;
  15.     System.out.println("i="+i);
  16.     Thread.sleep(1000);
  17.    }
  18.   }catch(InterruptedException ie){
  19.    ie.printStackTrace();
  20.   }
  21.  }
  22. }
  23. class testThread extends Thread{
  24.  @Override
  25.  public void run(){
  26.   try{
  27.    Thread.sleep(10000); //testThread线程约10秒后结束
  28.    System.out.println(Thread.currentThread().getName()+"线程结束!");
  29.   }catch(InterruptedException ie){
  30.    ie.printStackTrace();
  31.   }
  32.  }
  33. }
  34. public class Run {
  35.  public static void main(String[] args) {
  36.   // TODO Auto-generated method stub
  37.   try{
  38.    MyThread thread = new MyThread();
  39.    thread.setName("thread");
  40.    thread.setDaemon(true); //将thread线程设为守护线程
  41.    thread.start();
  42.    testThread t = new testThread();
  43.    t.setName("testThread");
  44.    t.start();
  45.    Thread.sleep(5000);  //main线程在这里停留5秒
  46.    System.out.println("主线程结束了");//5秒后main线程结束了,但是testThread线程还在执行,所以守护线程继续工作
  47.   
  48.    /*当所有线程都结束时,thread线程也随之结束*/
  49.   }catch(InterruptedException ie){
  50.    ie.printStackTrace();
  51.   }
  52.  }
  53. }

运行结果如下图