Java 守护进程线程和低优先级线程之间的区别
最近有人问我一个问题: 我们有Java 守护进程线程和低优先级线程之间的区别,java,multithreading,Java,Multithreading,最近有人问我一个问题: 我们有setPriority()方法为低优先级设置线程。 那为什么我们需要一个守护进程线程呢。他们之间有什么区别 将线程标记为守护进程是否会更改其调度 我们使用setPriority()方法将线程设置为低优先级。那为什么我们需要一个守护进程线程呢。他们之间有什么区别 通常,守护进程线程与优先级无关。当所有用户非守护进程线程完成时,JVM将关闭。将线程标记为守护进程线程意味着当JVM退出时可以安全地终止该线程 优先级是关于调度的——关于一个线程与准备运行的其他线程相比获得时
setPriority()
方法为低优先级设置线程。
那为什么我们需要一个守护进程线程呢。他们之间有什么区别
将线程标记为守护进程是否会更改其调度
我们使用setPriority()方法将线程设置为低优先级。那为什么我们需要一个守护进程线程呢。他们之间有什么区别
通常,守护进程线程与优先级无关。当所有用户非守护进程线程完成时,JVM将关闭。将线程标记为守护进程线程意味着当JVM退出时可以安全地终止该线程
优先级是关于调度的——关于一个线程与准备运行的其他线程相比获得时间片的频率。您可以有低优先级守护进程线程或高优先级守护进程线程。您可以有低优先级和高优先级的非守护进程线程。顺便说一句,线程优先级只适用于某些特定情况,当然也适用于体系结构,作为Java线程专家,我从不使用它们
这些概念是正交的(相互独立的)——至少在Java线程模型中是这样
关于何时创建线程守护进程,我将守护进程线程用于任何我不关心JVM退出时是否中断的任务:保持活动线程、统计处理器、日志处理等。。应用程序的所有关键任务都是一个非守护进程线程,必须特别中断或以某种方式发出退出信号。运行的守护进程线程不会阻止程序结束/退出。但是,所有用户线程必须在程序退出之前结束。优先级可以应用于守护进程或用户线程。您可以用日常生活中理解优先级的方式来理解优先级。如果Java运行时确定应用程序中运行的线程只有守护进程线程(即,不存在用户线程),Java运行时会立即关闭应用程序,有效地阻止了所有死掉的守护进程线程。为了让应用程序继续运行,它必须始终至少有一个活动用户线程。在所有其他方面,Java运行时以完全相同的方式处理守护进程线程和用户线程 除了守护进程线程中的。。当JVM突然终止时,最后一个块不会执行,堆栈不会展开——JVM只是退出。由于这个原因,守护进程线程应该谨慎使用,将它们用于可能执行任何类型I/O的任务是危险的。以下是一个示例:
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退出时是否中断的事情:保持活动线程、统计处理器、日志处理等等。。应用程序的所有关键任务都是非守护进程。