守护线程 与 非守护线程 的区别

举报
程序员小假 发表于 2025/08/03 11:11:28 2025/08/03
【摘要】 什么是守护线程,什么是非守护线程?Java有两种状态的线程守护线程(例如垃圾回收线程:gc线程)非守护线程(用户线程:用户线程即手动创建的线程) 守护线程与非守护线程的区别守护线程有一个特征,例如当主线程运行的时候,垃圾回收线程一起运行。当主线程销毁,会和主线程一起销毁。非守护线程如果主线程销毁,用户线程继续运行且互不影响。 守护线程与非守护线程代码演示区别创建守护线程public stat...
    • 什么是守护线程,什么是非守护线程?

      Java有两种状态的线程

  1. 守护线程(例如垃圾回收线程:gc线程)
  2. 非守护线程(用户线程:用户线程即手动创建的线程) 

    守护线程与非守护线程的区别

  3. 守护线程

  • 有一个特征,例如当主线程运行的时候,垃圾回收线程一起运行。
  • 当主线程销毁,会和主线程一起销毁。
  1. 非守护线程
  • 如果主线程销毁,用户线程继续运行且互不影响。 

    守护线程与非守护线程代码演示区别


    创建守护线程

    1. public static void main(String[] args) throws InterruptedException {
    2. Thread t1 = new Thread(new Runnable() {
    3. public void run() {
    4. while (true) {
    5. try {
    6. Thread.sleep(1000);
    7. } catch (Exception e) {
    8. // TODO: handle exception
    9. }
    10. System.out.println("我是子线程(用户线程)");
    11. }
    12. }
    13. });
    14. // 标识当前方法为守护线程,一定要在启动线程前设置为守护线程
    15. t1.setDaemon(true);
    16. t1.start();
    17. }

    必须在t1.start()之前设置,不能把正在运行的常规线程设置为守护线程,否则报IllegalThreadStateException异常 

    守护线程:主线程销毁停止,守护线程一起销毁

    1. public static void main(String[] args) {
    2. Thread t1 = new Thread(new Runnable() {
    3. public void run() {
    4. while (true) {
    5. try {
    6. Thread.sleep(1000);
    7. } catch (Exception e) {
    8. // TODO: handle exception
    9. }
    10. System.out.println("我是子线程(用户线程)");
    11. }
    12. }
    13. });
    14. // 标识当前方法为守护线程,一定要在启动线程前设置为守护线程
    15. t1.setDaemon(true);
    16. //启动线程
    17. t1.start();
    18. //相当与主线程
    19. for (int i = 0; i < 10; i++) {
    20. try {
    21. Thread.sleep(300);
    22. } catch (Exception e) {
    23. e.printStackTrace();
    24. }
    25. System.out.println("main:i:" + i);
    26. }
    27. System.out.println("主线程执行完毕...");
    28. }

    以下为运行结果:

    1. main:i:0
    2. main:i:1
    3. main:i:2
    4. 我是子线程(用户线程)
    5. main:i:3
    6. main:i:4
    7. main:i:5
    8. 我是子线程(用户线程)
    9. main:i:6
    10. main:i:7
    11. main:i:8
    12. 我是子线程(用户线程)
    13. main:i:9
    14. 主线程执行完毕...

    主线程结束之后并没有在继续运行守护线程,守护线程也跟着结束,一起销毁停止。 

    非守护线程:如果主线程销毁,用户线程继续运行且互不影响。

    1. public static void main(String[] args) {
    2. Thread t1 = new Thread(new Runnable() {
    3. public void run() {
    4. while (true) {
    5. try {
    6. Thread.sleep(1000);
    7. } catch (Exception e) {
    8. // TODO: handle exception
    9. }
    10. System.out.println("我是子线程(用户线程)");
    11. }
    12. }
    13. });
    14. //启动线程
    15. t1.start();
    16. //相当与主线程
    17. for (int i = 0; i < 10; i++) {
    18. try {
    19. Thread.sleep(300);
    20. } catch (Exception e) {
    21. e.printStackTrace();
    22. }
    23. System.out.println("main:i:" + i);
    24. }
    25. System.out.println("主线程执行完毕...");
    26. }

    以下为运行结果:

    1. main:i:0
    2. main:i:1
    3. main:i:2
    4. 我是子线程(用户线程)
    5. main:i:3
    6. main:i:4
    7. main:i:5
    8. 我是子线程(用户线程)
    9. main:i:6
    10. main:i:7
    11. main:i:8
    12. 我是子线程(用户线程)
    13. main:i:9
    14. 主线程执行完毕...
    15. 我是子线程(用户线程)
    16. 我是子线程(用户线程)
    17. 我是子线程(用户线程)
    18. 我是子线程(用户线程)
    19. 我是子线程(用户线程)
    20. 我是子线程(用户线程)
    21. 。。。。。。。。。。。。。。。。。。。。。

    当主线程销毁停止,非守护线程(用户线程)并没有结束,而是一直在执行,与主线程互不影响。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。