用户线程和守护线程

本文详细介绍了Java中用户线程和守护线程的区别,以及守护线程在如数据备份定时任务中的应用。特别关注了finally代码块在守护线程中的执行情况,指出在主线程结束时,守护线程的finally代码块可能不会被执行。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  本文内容大部分来自动力节点课程学习,感兴趣的可以直接去看原视频课程。

用户线程和守护线程

  Java语言中线程分为两大类:

  • 用户线程:主线程main方法是一个用户线程
  • 守护线程(后台线程):有代表性的是垃圾回收机制。一般守护线程是一个死循环,所有的用户线程只要结束,守护线程自动结束。

  守护线程用在的地方?

  • 每天00:00的时候系统数据自动备份,这个时候需要使用到定时器,并且可以将定时器设置为守护线程。所有的用户线程如果结束了,守护线程自动退出,没有必要进行数据备份了。
    • 实际开发中,每隔多久执行一段特定的程序,这种需求很常见,在Java开发中其实可以采用多种方式实现
      • 可以使用sleep方法,设置睡眠时间,这种是最原始的计时器
      • 在Java类库中已经写好了一个定时器:java.util.Timer,可以直接拿来用,目前这种任务在目前的开发中也很少用,因为现在有很多高级框架都是支持定时任务的
      • 实际开发中,目前使用较多的是Spring框架中提供的SpringTask,这个框架只要进行简单的配置,就可以完成定时器的任务
finally里面的语句一定会执行吗

  一般情况下都会执行的,有两种特殊情况,不允许再执行final中的代码

  • 使用System.exit来退出JVM

  • 把当前执行try catch finally代码的线程设置为守护线程

    • 原因:Java线程分为两类:守护线程和非守护线程。当所有的非守护线程中止时,无论是是否存在守护线程,JVM都会杀死守护线程从而中止程序。在JVM中,执行main方法的线程就是一个非守护线程,垃圾回收是一个守护线程,main执行完,程序就中止了,而不管垃圾回收线程是否中止。所以,如果守护线程中存在finally代码块,那么当所有的非守护线程中止时,守护线程被杀死,其finally代码块是不会执行的。

      public class ThreadTest01 {
          public static void main(String[] args) {
              MyThread myThread = new MyThread();
              Thread t = new Thread(myThread);
              // 设置为守护线程
              t.setDaemon(true);
              t.setName("备份数据");
              t.start();
      
              // 主线程:用户线程
              for(int i = 0; i < 10; i++){
                  System.out.println(Thread.currentThread().getName() + "--->" + i);
                  try{
                      Thread.sleep(1000);
                  }catch (InterruptedException e){
                      e.printStackTrace();
                  }finally {
                      System.out.println("执行用户线程finally代码块" + i);
                  }
              }
          }
      }
      class MyThread implements Runnable{
      
          @Override
          public void run() {
              int i = 0;
              while(true){
                  System.out.println(Thread.currentThread().getName() + "--->" + (++i));
                  try{
                      Thread.sleep(1000);
                  }catch (InterruptedException e){
                      e.printStackTrace();
                  }finally {
                      System.out.println("执行守护线程finally代码块" + i);
                  }
              }
          }
      }
      

      上述代码的执行结果为:

      main—>9
      执行守护线程finally代码块10
      备份数据—>11
      执行用户线程finally代码块9

      当主线程执行完成,守护线程自动结束,守护线程中的finally代码块不再执行

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值