zoukankan      html  css  js  c++  java
  • java守护线程与非守护线程的区别

    守护线程与用户线程

      用户线程:我们平常创建的普通线程。

      守护线程:用来服务于用户线程;不需要上层逻辑介入

      java线程分为守护线程和非守护线程,当java jvm检测主线程或其他子线程执行完之后,守护线程也会马上停止执行,我们可以使用Thread.setDaemon(ture或false)来设置一个线程是守护线程还是非守护线程,默认为false,可以通过Thread.isDaemon()方法查询该线程是否是守护线程

    1:我们将用案例来告诉你守护线程和非守护线程的区别和用法,代码如下,先设置其为守护线程。

    public class DeamonThread {
        public static void main(String[] args) {
            //"DeamonThread::print"是java1.8调用静态方法
            Thread thread = new Thread(DeamonThread::print);
            thread.setDaemon(true);
            thread.start();
            System.out.println("退出Main方法");
        }
    
        public static void print() {
            int counter = 1;
            while (true) {
                try {
                    System.out.println("Counter:" + counter++);
                    Thread.sleep(2000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    print()方法里面是一个while死循环,以上代码输出结果如下,只输出一次便退出了while(true)循环。

    退出Main方法
    Counter:1:

    2:如果我们将daemon设置为非守护线程,代码如下。

    thread.setDaemon(false);

    这时候就不会退出while(true)循环了,会一直执行下去,结果如下:

    退出Main方法
    Counter:1
    Counter:2
    Counter:3
    .......

    总结:非守护线程其实就是守护线程的氧气,如果氧气没了,守护线程也会跟着死掉。

    当线程只剩下守护线程的时候,JVM就会退出;补充一点如果还有其他的任意一个用户线程还在,JVM就不会退出。

    使用它需要注意些什么?

    1. thread.setDaemon(true)必须在thread.start()之前设置,否则会跑出一个IllegalThreadStateException异常。你不能把正在运行的常规线程设置为守护线程。
    2. 在Daemon线程中产生的新线程也是Daemon的。
    3. 守护线程不能用于去访问固有资源,比如读写操作或者计算逻辑。因为它会在任何时候甚至在一个操作的中间发生中断。
    4. Java自带的多线程框架,比如ExecutorService,会将守护线程转换为用户线程,所以如果要使用后台线程就不能用Java的线程池。

    意义及应用场景

      当主线程结束时,结束其余的子线程(守护线程)自动关闭,就免去了还要继续关闭子线程的麻烦。如:Java垃圾回收线程就是一个典型的守护线程;内存资源或者线程的管理,但是非守护线程也可以。

  • 相关阅读:
    高斯消元学习
    HDU 4596 Yet another end of the world(解一阶不定方程)
    Codeforces Round #318 div2
    HDU 4463 Outlets(一条边固定的最小生成树)
    HDU 4458 Shoot the Airplane(计算几何 判断点是否在n边形内)
    HDU 4112 Break the Chocolate(简单的数学推导)
    HDU 4111 Alice and Bob (博弈)
    POJ 2481 Cows(线段树单点更新)
    HDU 4288 Coder(STL水过)
    zoj 2563 Long Dominoes
  • 原文地址:https://www.cnblogs.com/myseries/p/13375814.html
Copyright © 2011-2022 走看看