Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 守护进程线程和低优先级线程之间的区别_Java_Multithreading - Fatal编程技术网

Java 守护进程线程和低优先级线程之间的区别

Java 守护进程线程和低优先级线程之间的区别,java,multithreading,Java,Multithreading,最近有人问我一个问题: 我们有setPriority()方法为低优先级设置线程。 那为什么我们需要一个守护进程线程呢。他们之间有什么区别 将线程标记为守护进程是否会更改其调度 我们使用setPriority()方法将线程设置为低优先级。那为什么我们需要一个守护进程线程呢。他们之间有什么区别 通常,守护进程线程与优先级无关。当所有用户非守护进程线程完成时,JVM将关闭。将线程标记为守护进程线程意味着当JVM退出时可以安全地终止该线程 优先级是关于调度的——关于一个线程与准备运行的其他线程相比获得时

最近有人问我一个问题:

我们有
setPriority()
方法为低优先级设置线程。 那为什么我们需要一个守护进程线程呢。他们之间有什么区别

将线程标记为守护进程是否会更改其调度

我们使用setPriority()方法将线程设置为低优先级。那为什么我们需要一个守护进程线程呢。他们之间有什么区别

通常,守护进程线程与优先级无关。当所有用户非守护进程线程完成时,JVM将关闭。将线程标记为守护进程线程意味着当JVM退出时可以安全地终止该线程

优先级是关于调度的——关于一个线程与准备运行的其他线程相比获得时间片的频率。您可以有低优先级守护进程线程或高优先级守护进程线程。您可以有低优先级和高优先级的非守护进程线程。顺便说一句,线程优先级只适用于某些特定情况,当然也适用于体系结构,作为Java线程专家,我从不使用它们

这些概念是正交的(相互独立的)——至少在Java线程模型中是这样


关于何时创建线程守护进程,我将守护进程线程用于任何我不关心JVM退出时是否中断的任务:保持活动线程、统计处理器、日志处理等。。应用程序的所有关键任务都是一个非守护进程线程,必须特别中断或以某种方式发出退出信号。

运行的守护进程线程不会阻止程序结束/退出。但是,所有用户线程必须在程序退出之前结束。优先级可以应用于守护进程或用户线程。您可以用日常生活中理解优先级的方式来理解优先级。

如果Java运行时确定应用程序中运行的线程只有守护进程线程(即,不存在用户线程),Java运行时会立即关闭应用程序,有效地阻止了所有死掉的守护进程线程。为了让应用程序继续运行,它必须始终至少有一个活动用户线程。在所有其他方面,Java运行时以完全相同的方式处理守护进程线程和用户线程

除了守护进程线程中的。。当JVM突然终止时,最后一个块不会执行,堆栈不会展开——JVM只是退出。由于这个原因,守护进程线程应该谨慎使用,将它们用于可能执行任何类型I/O的任务是危险的。

以下是一个示例:

  • 当低优先级线程完成时JVM将关闭。尽管守护进程线程仍在运行
  • 此外,还显示了由守护进程线程创建的线程自动成为守护进程线程

    package junk.daemon_thread_example;
    
    class DeamonThreadPlus implements Runnable{
        String id;
        boolean createChild;
    
        public DeamonThreadPlus(String id, boolean createChild){
            this.id = id;
            this.createChild = createChild;
        }
    
        @Override
        public void run() {
            // Parent daemon thread creates child daemon thread by default
            if (createChild)
                new Thread(new DeamonThreadPlus("DaemonChild", false)).start();
    
            // This thread never self-completes (only terminates when process dies)
            while (true){
                try {
                    Thread.sleep(1);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println("Daemon " 
                        + Thread.currentThread().isDaemon()
                        + " id = " + id);
                }
        }
    }
    
    class UThread implements Runnable{
    
        @Override
        public void run() {
            System.out.println("User thread start");
            try {
                Thread.sleep(5);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("User thread end (program exits)");
        }
    }
    
    public class Caller{
    
        public static void main(String[] args) {
            Thread dt = new Thread( new DeamonThreadPlus("Daemon", true));
            dt.setDaemon(true);
            dt.start();
    
            Thread ut = new Thread(new UThread());
            ut.setPriority(Thread.MIN_PRIORITY);
            ut.start(); 
        }
    
    }
    
    输出为: 用户线程启动
    守护进程真id=守护进程
    守护进程真id=DaemonChild
    守护进程真id=守护进程
    守护进程真id=DaemonChild
    守护进程真id=守护进程
    守护进程真id=DaemonChild
    守护进程真id=守护进程
    守护进程真id=DaemonChild
    用户线程结束(程序退出)
    守护进程真id=DaemonChild
    守护进程真id=守护进程


  • 谢谢,格雷。那么,创建一个线程(在java中)并使其成为守护进程线程有什么用呢?我们使用它有什么实际场景吗?我使用守护进程线程来处理任何我不关心JVM退出时是否中断的事情:保持活动线程、统计处理器、日志处理等等。。应用程序的所有关键任务都是非守护进程。