将线程设置为守护进程会发生什么?
这对线程有什么影响?
线程的“可以和不可以”的是什么?
setDaemon(true)
来显式指定由用户线程创建的线程为守护线程。
供您参考,
请注意,在调用线程的
start()
方法之前,必须先调用setDaemon()
方法。一旦线程已经开始执行(即它的
start()
方法已经被调用),则其守护进程状态无法更改。要确定线程是否为守护线程,请使用访问器方法isDaemon()
。
守护线程(daemon thread)和非守护线程的主要区别在于,当所有非守护线程终止时程序才会结束。所以,如果你有一个正在运行的守护线程并且结束了第一个线程,程序会终止。因此,你需要使用守护线程来保持程序运行的某些功能。
isDaemon()
为true。Java中守护线程和非守护线程的区别:
1)JVM在退出前不会等待任何守护线程完成。
2)当JVM终止时,守护线程与用户线程的处理方式不同,finally块不会被调用,堆栈也不会被解开,JVM直接退出。
守护线程不会阻止程序结束。
举个例子:
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虚拟机中找到的垃圾收集器线程。它需要在任何其他线程运行时持续运行,但不应阻止程序退出。当程序退出时,就不再需要垃圾收集器。