有关守护线程和非守护线程鲜为人知的事实

  • 非守护线程也被称为用户线程。
  • 只要有哪怕 1 个非守护线程(即:用户线程)仍处于活动中,JVM 就不会退出。另一方面,即使有多个守护线程处于活动状态,JVM 也可以退出。
  • JVM 停止运行时,守护线程会被突然放弃,因此最后代码块不被执行。由于这一原因,我们应当谨慎使用守护线程,不建议将其用于执行 I/O 操作的任务。假设您正在使用守护线程与数据库建立连接,并且在 finally 子句中关闭数据库连接。如果 JVM 停止运行,那么 finally 子句将不会被执行。意味着 DB 连接将不会被正确关闭。这就会导致数据库端的连接泄漏。
  • 大部分 JVM 线程都是守护线程。以下列出了部分选项:
  1. 垃圾回收线程
  2. Finalizer 线程
  3. RMI 线程
  4. 编译器线程
  5. java.util.TimerThread
  • 创建新线程时,其将继承其父线程的守护线程状态。您可通过调用 setDaemon(boolean) 来将线程设置为守护线程,或取消其守护线程状态。但此方法应在线程开始前调用。
  • Java 虚拟机启动时,会有一个非守护线程调用指定类的 main() 方法。这就是为什么所有由主线程创建的子线程默认都是非守护线程的原因——因为主线程是非守护线程。
  • 如需了解应用程序中有多少线程是守护线程和非守护线程,可从应用程序中捕获线程转储文件,并将其上传至 fastthread.io。在这里转储文件将被解析,然后系统将告诉您哪些线程是守护线程,哪些线程是非守护线程。

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s

Blog at WordPress.com.

Up ↑

%d bloggers like this: