什么是守护线程

在 Java 中有两类线程:

  • User Thread(用户线程):就是应用程序里的自定义线程。
  • Daemon Thread(守护线程):比如垃圾回收线程,就是最典型的守护线程

    守护线程(即 Daemon Thread),是一个服务线程,准确地来说就是服务其他的线程, 这是它的作用,而其他的线程只有一种,那就是用户线程
    守护线程特点: 守护线程会随着用户线程死亡而死亡

守护线程与用户线程的区别

用户线程,不随着主线程的死亡而死亡。用户线程只有两种情况会死掉,1 在 run 中异 常终止。2 正常把 run 执行完毕,线程死亡。
守护线程,随着用户线程的死亡而死亡,当用户线程死亡守护线程也会随之死亡。

守护线程的使用

  1. public class DaemonThreadDemo {
  2. public static void main(String[] args) {
  3. Thread userThread=new Thread(new UserThread(),"UserThread");
  4. userThread.start();
  5. try {
  6. Thread.sleep(1000);
  7. } catch (InterruptedException e) {
  8. e.printStackTrace();
  9. }
  10. System.out.println("主线程结束");
  11. }
  12. }
  13. class Daemon implements Runnable{
  14. @Override
  15. public void run() {
  16. for(int i=0;i<20;i++){
  17. System.out.println(Thread.currentThread().getName()+" "+i);
  18. try {
  19. Thread.sleep(2000);
  20. } catch (InterruptedException e) {
  21. e.printStackTrace();
  22. }
  23. }
  24. }
  25. }
  26. class UserThread implements Runnable{
  27. @Override
  28. public void run() {
  29. Thread daemonThread =new Thread(new Daemon(),"Daemon");
  30. daemonThread.setDaemon(true); //将该线程设为本线程的守护线程
  31. daemonThread.start(); //守护线程启动
  32. for(int i=0;i<5;i++){
  33. System.out.println(Thread.currentThread().getName()+" "+i);
  34. try {
  35. Thread.sleep(500);
  36. } catch (InterruptedException e) {
  37. e.printStackTrace();
  38. }
  39. }
  40. }
  41. }

image.png
很明显,守护线程还没执行完,但从属的线程已经结束,所以它只能结束