2011-06-10 87 views

回答

4

守护进程线程和非守护进程线程之间的主要区别在于,当所有非守护进程线程都终止时,程序将终止。所以如果你有一个活动的守护进程线程并结束你的第一个线程,程序就会终止。所以,只要程序运行,你就会想要使用一个守护线程来保存你想要做的事情。

6

一个守护线程是一个线程,这并不妨碍JVM退出时程序完成,但线程仍在运行。 守护线程是服务供应商在同一个进程中守护线程

E.g垃圾收集运行的其他线程。

通过调用Thread对象上的setDaemon(true),可以明确指定用户线程创建的线程为守护进程线程。


供您参考,

注意,setDaemon()方法必须 线程的start() 方法之前被称为是一个invoked.Once线程 开始执行(即其start() 方法被称为)它的守护进程 状态不能改变。若要确定 线程是否为守护进程线程,请使用 访问器方法isDaemon()

1

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

标志isDaemon()将被设置为true。

什么不会发生是;此线程不会停止应用程序退出。

这会对线程造成什么影响?

没有,除非你看isDaemon()方法。

线程上的“can and can'ts”是什么?

你可以在守护线程中做任何事情,你可以在非守护线程中做任何事情。
你不能保证线程将完成。在Java的守护程序和非守护线程之间

0

差异:

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

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

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虚拟机中找到的垃圾回收线程。它需要在任何其他线程运行时连续运行,但不应阻止程序退出。程序退出时,不再需要垃圾收集器。