zoukankan      html  css  js  c++  java
  • 后台线程

      后台(daemon)线程,是指程序运行的时候在后台提供一种通用服务的线程。当所有非后台线程结束时,程序也就结束了,程序中的所有后台线程也会被终止,而只要有非后台线程还在运行,程序也就不会结束,后台线程也会继续运行。

      先看一个非后台线程的例子,定义一个简单的任务,每隔两秒输出调用该任务的线程信息:

    public class SimpleDaemons implements Runnable {
    
        @Override
        public void run() {
            while(true){
                try {
                    TimeUnit.SECONDS.sleep(2);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println(Thread.currentThread());
            }
        }
    
    }

      启动任务,调用main()函数的线程睡眠5s后输出”main“:

    public class Main {
    
        public static void main(String[] args) {
            Thread t = new Thread(new SimpleDaemons());
            t.start();
            try {
                TimeUnit.SECONDS.sleep(5);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("main");
        }
    }

      此时t是非后台线程,运行程序输出:

    Thread[Thread-0,5,main]
    Thread[Thread-0,5,main]
    main
    Thread[Thread-0,5,main]
    Thread[Thread-0,5,main]
    ...

      我们将t设置为后台线程,在线程启动之前调用setDaemon()方法

    public class Main {
    
        public static void main(String[] args) {
            Thread t = new Thread(new SimpleDaemons());
            t.setDaemon(true);
            t.start();
            try {
                TimeUnit.SECONDS.sleep(5);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("main");
        }
    }

      运行程序输出:

    Thread[Thread-0,5,main]
    Thread[Thread-0,5,main]
    main

      只有三个输出就结束了,这是因为调用main()函数的线程睡眠5s,因此5s的时间中t线程输出两次,随后mian()函数结束,程序中没有运行任何非后台线程,程序结束,所有的后台线程也被杀死。

  • 相关阅读:
    Spring Boot实现发送邮件
    IDEA thymeleaf ${xxx.xxx}表达式报错,红色波浪线
    解决springboot——集成 mybatis遇到的问题:No MyBatis mapper was found in '[com.example.demo]' package...
    解决Intellij IDEA中Mybatis Mapper自动注入警告
    System.gc()和Runtime.gc()的区别
    Java中定时器相关实现的介绍与对比之:Timer和TimerTask
    markdown语法介绍
    Java VisualVM使用
    Linux系统负载查询
    Kafka高性能吞吐关键技术分析
  • 原文地址:https://www.cnblogs.com/qilong853/p/5898908.html
Copyright © 2011-2022 走看看