Java线程 - 守护线程?

3

将线程设置为守护进程会发生什么?

这对线程有什么影响?

线程的“可以和不可以”的是什么?

5个回答

6
一个守护线程是一种线程,当程序结束但该线程仍在运行时,不会阻止JVM退出。 守护线程是在与它相同的进程中运行的其他线程的服务提供者,例如垃圾回收。您可以通过在Thread对象上调用setDaemon(true)来显式指定由用户线程创建的线程为守护线程。

供您参考,

请注意,在调用线程的 start() 方法之前,必须先调用 setDaemon() 方法。一旦线程已经开始执行(即它的 start() 方法已经被调用),则其守护进程状态无法更改。要确定线程是否为守护线程,请使用访问器方法 isDaemon()


4

守护线程(daemon thread)和非守护线程的主要区别在于,当所有非守护线程终止时程序才会结束。所以,如果你有一个正在运行的守护线程并且结束了第一个线程,程序会终止。因此,你需要使用守护线程来保持程序运行的某些功能。


1
一个作为守护线程的线程会发生什么?
将设置标志isDaemon()为true。
不会发生的事情是; 这个线程不会阻止应用程序退出。
这对线程有什么影响?
除非您查看isDaemon()方法,否则没有影响。
线程的"可以和不能"是什么?
在守护线程中,您可以做任何非守护线程可以做的事情。 无法保证线程完成。

0

Java中守护线程和非守护线程的区别:

1)JVM在退出前不会等待任何守护线程完成。

2)当JVM终止时,守护线程与用户线程的处理方式不同,finally块不会被调用,堆栈也不会被解开,JVM直接退出。


0

守护线程不会阻止程序结束。

举个例子: Java应用程序最初只启动一个线程,“main”线程运行main方法。这是普通(非守护)线程。现在再想象一下,程序启动了另一个线程,并在循环中做某些事情。如果新线程是普通(非守护)线程,它将防止主线程“main”结束并永远继续运行!

class HelloThread extends Thread  
{  
  public void run()  
  {  
    for ( ; ; )  
    {  
      System.out.println("hello");  
      sleep(1000);  
    }  
  }  
}  
public class RegularThreader  
{  
  public static void main(String[] args)  
  {  
    Thread hello = new HelloThread();  
    hello.start();  
    System.out.println("Sorry, I must be leaving");  
  }  
}  

现在,这并不总是所需的。有时候你想在程序结束时结束这个“后台”处理。为了做到这一点,你可以将线程标记为守护线程。守护线程不会阻止程序结束,但会在主线程停止时停止。

 public class DaemonThreader  
    {  
      public static void main(String[] args)  
      {  
        Thread hello = new HelloThread();  
        hello.setDaemon(true);  
        hello.start();  
        System.out.println("Sorry, I must be leaving");  
      }  
}  

尝试运行上述两个不同的类,并查看输出如何不同。 守护线程的经典示例是许多Java虚拟机中找到的垃圾收集器线程。它需要在任何其他线程运行时持续运行,但不应阻止程序退出。当程序退出时,就不再需要垃圾收集器。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接