Java中的守护进程线程是一个低优先级线程,在后台运行以执行垃圾收集等任务。Java中的守护进程线程也是一个向用户线程提供服务的服务提供者线程。它的生命取决于用户线程的命运,也就是说,当所有用户线程都死掉时,JVM会自动终止这个线程。
简单地说,我们可以说它为后台支持任务的用户线程提供服务。它除了为用户线程服务之外,在生活中没有任何作用。
Java中的守护进程线程示例: Java中的垃圾收集(gc)、终结器等。
Java守护进程线程的属性
- 当所有用户线程完成执行时,它们无法阻止JVM退出。
- 当所有用户线程完成执行时,JVM会自动终止。
- 如果JVM发现一个正在运行的守护进程线程,它会终止该线程,然后关闭它。JVM不关心守护进程线程是否正在运行。
- 这是一个极低优先级的线程。
守护进程线程的默认性质
默认情况下,主线程始终是非守护进程,但对于所有剩余线程,守护进程的性质将从父线程继承到子线程。也就是说,如果父进程是守护进程,那么子进程也是守护进程,如果父进程是非守护进程,那么子进程也是非守护进程。
注: 每当最后一个非守护进程线程终止时,所有守护进程线程都将自动终止。
守护进程线程的方法
1.void setDaemon(布尔状态):
此方法将当前线程标记为守护进程线程或用户线程。例如,如果我有一个用户线程tU,那么tU.setDaemon(true)将使其成为一个守护进程线程。另一方面,如果我有一个守护进程线程tD,那么就调用tD。setDaemon(false)将使其成为用户线程。
语法:
public final void setDaemon(boolean on)
参数:
- 关于: 如果为true,则将此线程标记为守护进程线程。
例外情况:
- 非法例外 :如果只有此线程处于活动状态。
- 安全例外: 如果当前线程无法修改此线程。
2.布尔isDaemon():
此方法用于检查当前线程是否为守护进程。如果线程是守护进程,则返回true。否则,它将返回false。
语法:
public final boolean isDaemon()
返回:
如果该线程是守护进程线程,则该方法返回true;否则就错了
JAVA
// Java program to demonstrate the usage of // setDaemon() and isDaemon() method. public class DaemonThread extends Thread { public DaemonThread(String name){ super (name); } public void run() { // Checking whether the thread is Daemon or not if (Thread.currentThread().isDaemon()) { System.out.println(getName() + " is Daemon thread" ); } else { System.out.println(getName() + " is User thread" ); } } public static void main(String[] args) { DaemonThread t1 = new DaemonThread( "t1" ); DaemonThread t2 = new DaemonThread( "t2" ); DaemonThread t3 = new DaemonThread( "t3" ); // Setting user thread t1 to Daemon t1.setDaemon( true ); // starting first 2 threads t1.start(); t2.start(); // Setting user thread t3 to Daemon t3.setDaemon( true ); t3.start(); } } |
输出:
t1 is Daemon thread t3 is Daemon thread t2 is User thread
守护进程线程中的异常
如果在启动线程后调用setDaemon()方法,它将抛出 非法例外 .
JAVA
// Java program to demonstrate the usage of // exception in Daemon() Thread public class DaemonThread extends Thread { public void run() { System.out.println( "Thread name: " + Thread.currentThread().getName()); System.out.println( "Check if its DaemonThread: " + Thread.currentThread().isDaemon()); } public static void main(String[] args) { DaemonThread t1 = new DaemonThread(); DaemonThread t2 = new DaemonThread(); t1.start(); // Exception as the thread is already started t1.setDaemon( true ); t2.start(); } } |
运行时异常:
Exception in thread "main" java.lang.IllegalThreadStateException at java.lang.Thread.setDaemon(Thread.java:1352) at DaemonThread.main(DaemonThread.java:19)
输出:
Thread name: Thread-0 Check if its DaemonThread: false
这清楚地表明,我们无法在启动线程后调用setDaemon()方法。
守护进程与用户线程
- 优先: 当进程中唯一剩下的线程是守护进程线程时,解释器将退出。这是有意义的,因为当只剩下守护进程线程时,就没有其他线程可以由守护进程线程提供服务。
- 用法: 守护进程线程是为后台支持任务的用户线程提供服务。
本文由 萨凯特·库马尔 .如果你喜欢GeekSforgek,并想贡献自己的力量,你可以使用 写极客。组织 或者把你的文章寄去评论-team@geeksforgeeks.org.看到你的文章出现在Geeksforgeks主页上,并帮助其他极客。如果您发现任何不正确的地方,或者您想分享有关上述主题的更多信息,请写下评论。