• 08_控制线程_后台线程(守护线程)


    【后台线程】

    后台线程(Daemon Thread):运行在后台,他的任务是为其它的线程提供服务,又称为"守护线程"。JVM的垃圾回收线程就是典型的后台线程。

    [ 特征 ]

    如果所有的前台线程都死亡,后台线程会自动死亡。

    调用Thread对象的setDaemon(true)方法可以将指定的线程设置成后台线程。

    当整个虚拟机中只剩下后台线程时,程序就没有继续运行的必要了,所以虚拟机也就退出了。

    Thread类提供了一个isDaemon()方法,用来判断指定线程是否为后台线程。

    【示例代码】

    package com.Higgin.part02;
    
    class DaemonThread implements Runnable{
    
        //定义后台线程的形成执行体和普通线程无区别
        @Override
        public void run() {
            for(int i=0;i<1000;i++){
                System.out.println(Thread.currentThread().getName()+"===="+i);
            }
        }
        
    }
    
    public class Demo02 {
        public static void main(String[] args) {
            DaemonThread dt=new DaemonThread();
            Thread t1=new Thread(dt,"后台线程");
            t1.setDaemon(true);  //将此线程设置成后台线程!!
            t1.start();  //启动线程
            
            for(int i=0;i<100;i++){
                System.out.println(Thread.currentThread().getName()+"===="+i);
            }
            //main线程运行到for循环结束,就算此时后台线程的执行体for循环未结束 ,也得结束线程!
        }
    }

    【运行结果】

    后台线程本来希望运行到i=999的,但是前台唯一的main主线程运行结束了,JVM自动退出,后台线程也会随之结束。

    【小结】

    从上面的代码看,主线程默认是前台线程,t1线程设置为后台线程。

    【注意1】

    并不是所有的线程默认都是前台线程,

    前台线程创建的子线程默认是前台线程

    后台线程创建的子线程默认是后台线程

    【注意2】

    前台线程死亡后,JVN会通知后台线程死亡,但从它收到指令到做出相应,需要一定的时间,而且要将某个线程设置为后台线程,必须要在该线程启动之前(比如本案例中main()方法的for循环之前),即setDaemon(true)必须在start()方法之前调用,否则会引发IllegalThreadStateException异常。

  • 相关阅读:
    deep learning 以及deep learning 常用模型和方法
    神经网络和误差逆传播算法(BP)
    机器学习常见面试题整理
    Xcode8更新CocoaPods报错解决办法
    iOS、swift、React Native学习常用的社区、论坛
    iOS 一个app跳转另一个app并实现通信(如A跳到B并打开B中指定页面)
    Xcode LLDB Debug教程
    BLOCK封装带菊花的网络请求
    AFN的初步封装(post、GET、有无参数)
    银行卡格式化输出及后四位显示
  • 原文地址:https://www.cnblogs.com/HigginCui/p/5903533.html
Copyright © 2020-2023  润新知