线程分类(前台线程与后台线程)知识点笔记

一、概念与分类

  1. 前台线程(用户线程)

    • 定义:默认创建的线程类型,负责核心业务逻辑,是程序运行的主体。
    • 特点:JVM 必须等待所有前台线程执行完毕才会退出,即使主线程结束,其他前台线程仍可继续运行。
  2. 后台线程(守护线程 / Daemon Thread)

    • 定义:为前台线程提供服务的辅助线程(如日志、监控、垃圾回收等)。
    • 特点:依赖前台线程存在,当所有前台线程结束后,JVM 会强制终止所有后台线程,无需等待其执行完毕。

二、核心区别

对比项 前台线程 后台线程
默认类型 是(创建后默认为此类型) 否(需显式设置)
JVM 退出条件 等待所有前台线程执行完毕 随最后一个前台线程结束而终止
作用 执行核心业务逻辑 提供辅助服务

三、后台线程的设置与注意事项

  1. 设置方法

    • 调用 Thread 类的 setDaemon(boolean on) 方法,参数为 true 时设置为后台线程。

    • 示例:

      1
      2
      3
      Thread daemonThread = new Thread(() -> { ... });
      daemonThread.setDaemon(true); // 设置为后台线程
      daemonThread.start(); // 必须在启动前设置
  2. 关键限制

    • 设置时机:必须在 start() 方法调用前设置,否则会抛出 IllegalThreadStateException
    • 继承性:若父线程是后台线程,子线程默认也是后台线程(可通过 setDaemon() 修改)。
    • 资源处理:后台线程被强制终止时,不会执行 finally 块中的资源释放逻辑,需谨慎处理资源。

四、典型应用场景

  • 前台线程:用户交互线程(如 GUI 事件处理)、核心业务计算线程等。
  • 后台线程:垃圾回收线程(JVM 自带的后台线程)、日志输出线程、定时任务监控线程等。

五、示例说明(结合代码)

  • 主线程(main)和 FrontThread 是前台线程,执行完毕后才会触发 JVM 退出判断。
  • DeadThread 被设置为后台线程,当所有前台线程(main 和 FrontThread)结束后,即使其 500 次循环未完成,也会被强制终止。