• 守护线程


    守护线程是一种比较特殊的线程,一般用于处理后台的工作,它会随着调用线程的结束而技术:

    看下面一段代码

    package com.example.demo.threads;
    
    
    import java.util.concurrent.TimeUnit;
    
    /**
     * 守护线程
     */
    public class MainTest2 {
    
        public static void main(String[] args) {
    
            Thread thread = new Thread(new Runnable() {
                @Override
                public void run() {
                    try {
                        TimeUnit.SECONDS.sleep(10);
                        System.out.println(">>>>>执行了10秒的方法,线程name:" + Thread.currentThread().getName());
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            });
            thread.start();
            //thread.setDaemon(true);
    
            try {
                TimeUnit.SECONDS.sleep(5);
                System.out.println(">>>>>执行了5秒的方法,线程name:" + Thread.currentThread().getName());
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

    执行这段程序之后就会发现,程序先打印主现成的的main方法,在打印thread-0的方法,在此期间jvm没有关闭,一直等到执行完了Thread-0打印的方法时才退出。

     接下来在看下我们代码,设置一下thread为守护线程

    package com.example.demo.threads;
    
    
    import java.util.concurrent.TimeUnit;
    
    /**
     * 守护线程
     */
    public class MainTest2 {
    
        public static void main(String[] args) {
    
            Thread thread = new Thread(new Runnable() {
                @Override
                public void run() {
                    try {
                        TimeUnit.SECONDS.sleep(10);
                        System.out.println(">>>>>执行了10秒的方法,线程name:" + Thread.currentThread().getName());
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            });
    
            thread.setDaemon(true);
    
            thread.start();
    
            try {
                TimeUnit.SECONDS.sleep(5);
                System.out.println(">>>>>执行了5秒的方法,线程name:" + Thread.currentThread().getName());
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
    
        }
    }

    执行的结果如下:它并没有等到Thread线程执行完毕在结束,而是直接随着main线程的结束而结束。

     注意点:

    1.设置线程为守护线程很简单,调用线程的setDaemon()方法设置成true即可,false为正常线程

    2.线程是否为守护线程和他的父线程有很大的关系,如果父线程为正常线程,则子线程也是守护线程。反之,如果想要修改就可以借助 setDaemon()方法

    3.线程的isDaemon方法可以判断线程是否为守护线程。

    4.setDaemon()的方法只有在线程启动之前才能生效,如果一个线程已经死忙,那么在设置setDaemon就会抛出 IllegalThreadStateException的异常。

    守护线程的作用:

    1.守护线程的特点,当主线程结束的时候,其(主线程开启的子线程)也跟着结束。

    2.使用场景,jvm虚拟机中的垃圾回收线程。

    3.比如有一个游戏程序,其中有一个线程正在与服务器不断的进行交互获取玩家最新的金币,武器等这些信息,若希望在退出游戏客户端的时候,这些数据同步的工作也能立即结束。

    4.比如注册中心(eruka)中与服务的心跳传输机制。

  • 相关阅读:
    中债登、银行间市场、上清所… 这些机构你能分清几个?
    期货界的四大天王
    心理学的几个现象
    西方金融交易员揭露行业潜规则
    瑞银保住欧股交易经纪龙头宝座 算法交易傲视同业
    【Python】 zabbixAPI的包装pyzabbix
    【Python】 日志管理logging
    【Python】 子进程创建与使用subprocess
    【Python】 配置解析ConfigParser & 命令行参数解析optparser
    【Python】 SSH连接的paramiko
  • 原文地址:https://www.cnblogs.com/cb1186512739/p/14274949.html
Copyright © 2020-2023  润新知