Java多线程-daemon守护线程

案例一:

/**
 * 什么是守护线程?
 * 当 JVM 中不存在任何一个正在运行的非守护线程时,则 JVM 进程即会退出。
 * 如果 JVM 中没有一个正在运行的非守护线程,这个时候,JVM 会退出。换句话说,守护线程拥有自动结束自己生命周期的特性,而非守护线程不具备这个特点。
 *
 * 应用场景:
 * JVM 中的垃圾回收线程就是典型的守护线程,如果说不具备该特性,会发生什么呢?
 * 当 JVM 要退出时,由于垃圾回收线程还在运行着,导致程序无法退出,这就很尴尬了!!!由此可见,守护线程的重要性了。
 * 通常来说,守护线程经常被用来执行一些后台任务,但是呢,你又希望在程序退出时,或者说 JVM 退出时,线程能够自动关闭,此时,守护线程是你的首选,这样jvm进程就能优雅的关闭
 *
 */
public class DaemonThreadTest_2 extends Thread {
   
    public static void main(String[] args) throws InterruptedException {
        DaemonThreadTest_2 test = new DaemonThreadTest_2();
        // 如果不设置daemon,那么线程将输出100后才结束,此处是将test设置为守护线程
        test.setDaemon(true);   //注意设置守护线程时要在线程启动之前,否则就会报异常
        test.start();
        System.out.println("isDaemon = " + test.isDaemon());
        TimeUnit.SECONDS.sleep(1);
        System.out.println("isDaemon test");
    }

    public void run() {
        for (int i = 0; i < 100; i++) {
            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println(i);
        }
    }
}
/**
 * 如果test不设置为守护线程,当主线程main先执行完毕后,不会影响到test的打印,test线程会输出到99,
 * 但是当test设置了守护线程,主线程main先执行完毕后,不管test执行是否完毕,都会退出
 */

案例二:

/**
 * 线程里再开启一个线程,守护线程做测试
 */
public class DaemonThread2 {

    public static void main(String[] args) throws InterruptedException {

        //线程里再开启一个线程
       Thread t1=new Thread(new Runnable() {
           @Override
           public void run() {
              Thread t2= new Thread(new Runnable() {
                   @Override
                   public void run() {
                       try {
                           Thread.sleep(10000);
                           System.out.println("t2完成");
                       } catch (InterruptedException e) {
                           e.printStackTrace();
                       }
                   }
               });
              t2.setDaemon(true);   //启动一个守护线程,当t1结束,t2就结束,jvm进程就退出了,不会等待t2运行完毕才退出
              t2.start();
               try {
                   Thread.sleep(1000);
                   System.out.println("t1完成");
               } catch (InterruptedException e) {
                   e.printStackTrace();
               }
           }
       });
       t1.start();

    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值