java threading - 守护程序线程?

时间:2011-06-10 01:17:28

标签: java multithreading

被视为守护进程的线程会发生什么?

这会给线程带来什么影响?

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

5 个答案:

答案 0 :(得分:6)

守护程序线程 是一个线程,当程序完成但线程仍在运行时,它不会阻止JVM退出。 守护程序线程 是与守护程序线程在同一进程中运行的其他线程的服务提供程序

垃圾收集。

您可以通过调用Thread对象上的setDaemon(true),将用户线程创建的线程显式指定为守护程序线程。


供您参考,

  

请注意,setDaemon()方法必须   在线程start()之前调用   调用方法。一个线程有   开始执行(即start()   方法已被调用)其守护进程   状态无法更改。确定   如果一个线程是一个守护程序线程,请使用   存取方法isDaemon()

答案 1 :(得分:4)

守护程序线程和非守护程序线程之间的主要区别在于程序在所有非守护程序线程终止时终止。因此,如果您有一个活动的守护程序线程并结束您的第一个线程,程序将终止。因此,只要程序正在运行,您就会想要使用守护程序线程来执行某些操作。

答案 2 :(得分:1)

  

被视为守护进程的线程会发生什么?

标志isDaemon()将设置为true。

不会发生的事情是;该线程不会阻止应用程序退出。

  

这会给线程带来什么影响?

除非你看一下isDaemon()方法,否则什么都没有。

  

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

您可以在非守护程序线程中执行的守护程序线程中执行任何操作 你不能保证线程会完成。

答案 3 :(得分:0)

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

1)JVM不会等待任何守护程序线程在现有之前完成。

2)当JVM终止时,守护进程线程的处理方式与用户线程不同,最后不会调用块,堆栈不会被解除,JVM就会退出。

答案 4 :(得分:0)

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

举个例子: Java应用程序只用一个线程开始,“”线程运行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虚拟机中的垃圾收集器线程。它需要在任何其他线程运行时连续运行,但不应阻止程序退出。当程序退出时,不再需要垃圾收集器。