美文网首页
守护线程的作用与实现

守护线程的作用与实现

作者: 奋斗的韭菜汪 | 来源:发表于2021-06-16 16:11 被阅读0次

定义:

守护线程--也称“服务线程”,在没有用户线程可服务时会自动离开。优先级:守护线程的优先级比较低,用于为系统中的其它对象和线程提供服务。

设置:

通过setDaemon(true)来设置线程为“守护线程”;将一个用户线程设置为守护线程的方式是在 线程对象创建 之前 用线程对象的setDaemon方法。

为什么需要守护线程

当JVM中还有线程在执行的时候是不会退出的,意思是非守护线程会“阻止”JVM退出。守护线程不会这样,当JVM中所有非守护线程执行完毕后就会退出执行,并不会考虑是否还有守护线程未执行完毕。JVM中的GC线程就是守护线程,这样设计目的很明确,当你所有的程序都执行完毕了,留着这个GC线程就没有任何意义了。反过来可以设想,如果把GC线程设计成非守护线程,当你明确你的程序都执行完毕了,但是就是不自动退出岂不是很奇怪?

example:

垃圾回收线程就是一个经典的守护线程,当我们的程序中不再有任何运行的Thread,程序就不会再产生垃圾,垃圾回收器也就无事可做,所以当垃圾回收线程是JVM上仅剩的线程时,垃圾回收线程会自动离开。它始终在低级别的状态中运行,用于实时监控和管理系统中的可回收资源。

生命周期:

守护进程(Daemon)是运行在后台的一种特殊进程。它独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件。也就是说守护线程不依赖于终端,但是依赖于系统,与系统“同生共死”。那Java的守护线程是什么样子的呢。当JVM中所有的线程都是守护线程的时候,JVM就可以退出了;如果还有一个或以上的非守护线程则JVM不会退出。

例子程序:

thread = new Thread(this);

thread.setDaemon(true);

thread.start();

当java虚拟机中没有非守护线程在运行的时候,java虚拟机会关闭。当所有常规线程运行完毕以后,守护线程不管运行到哪里,虚拟机都会退出运行。所以你的守护线程最好不要写一些会影响程序的业务逻辑。否则无法预料程序到底 会出现什么问题。

import java.io.IOException;

/*

* 守护线程在没有用户线程可服务时自动离开

* 在Java中比较特殊的线程是被称为守护(Daemon)线程的低级别线程。

* 这个线程具有最低的优先级,用于为系统中的其它对象和线程提供服务。

* 将一个用户线程设置为守护线程的方式是在线程对象创建之前调用线程对象的setDaemon方法。

* 典型的守护线程例子是JVM中的系统资源自动回收线程,

* 我们所熟悉的Java垃圾回收线程就是一个典型的守护线程,

* 当我们的程序中不再有任何运行中的Thread,

* 程序就不会再产生垃圾,垃圾回收器也就无事可做,

* 所以当垃圾回收线程是Java虚拟机上仅剩的线程时,Java虚拟机会自动离开。

* 它始终在低级别的状态中运行,用于实时监控和管理系统中的可回收资源。

* 守护进程(Daemon)是运行在后台的一种特殊进程。它独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件。

* 也就是说守护线程不依赖于终端,但是依赖于系统,与系统“同生共死”。

* 那Java的守护线程是什么样子的呢。

* 当JVM中所有的线程都是守护线程的时候,JVM就可以退出了;

* 如果还有一个或以上的非守护线程则JVM不会退出。

*/

//代码片段
    private void scheduleClockUpdating() {
        ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor(new ThreadFactory() {
            @Override
            public Thread newThread(Runnable runnable) {
                Thread thread = new Thread(runnable, "System Clock");
                //设置定时任务线程为守护线程
                thread.setDaemon(true);
                return thread;
            }
        });
        scheduler.scheduleAtFixedRate(new Runnable() {
            @Override
            public void run() {
                now.set(System.currentTimeMillis());
            }
        }, period, period, TimeUnit.MILLISECONDS);
    }

相关文章

  • 守护线程的作用与实现

    定义: 守护线程--也称“服务线程”,在没有用户线程可服务时会自动离开。优先级:守护线程的优先级比较低,用于为系统...

  • java面试知识点(三)

    实现多线程的两种方法:Thread与Runable: Thread类实现了Runnable。 用户线程和守护线程:...

  • 线程知识点复习(一)

    守护线程与非守护线程: java中有两条线程:1.守护线程,2.非守护线程(用户线程)守护线程与main主线程同时...

  • Java多线程之<<守护线程>>实战

    定义 什么是守护线程?与守护线程相对应的就是用户线程,守护线程就是守护用户线程,当用户线程全部执行完结束之后,守护...

  • 什么是守护线程

    守护线程定义与守护线程相对应就是用户线程,用户线程可以理解为系统工作的线程,而守护线程守护的就是用户线程。当用户线...

  • 父子进程 父子线程 守护线程

    参考 Java中的父线程与子线程守护线程与守护进程 主线程与子线程生命周期没关系 Son.java Main.ja...

  • 并发编程和JVM调优

    并发编程三要素 原子性 有序性 可见性 守护线程和非守护线程 非守护线程运行结束,jvm退出,与守护线程是否存在无...

  • 详解Java中的守护线程

    线程分类 守护线程(即daemon thread),是个服务线程,准确地来说就是服务其他的线程,这是它的作用——而...

  • python线程的一些知识

    python threading模块 重写threading.Thread来实现: 守护线程: 线程的生命周期: ...

  • 守护线程与非守护线程

    参考:守护线程与非守护线程 > https://www.cnblogs.com/lixuan1998/p/6937...

网友评论

      本文标题:守护线程的作用与实现

      本文链接:https://www.haomeiwen.com/subject/hwqfyltx.html