Java 中的守护线程
Java 中的守护线程是一个低优先级线程,在后台运行,执行垃圾收集等任务。Java 中的守护线程也是一个服务提供者线程,为用户线程提供服务。它的生命依赖于用户线程的支配,即当所有用户线程死亡时,JVM 自动终止这个线程。
简单来说,我们可以说它为用户线程提供后台支持任务的服务。除了服务用户线程,它在生活中没有任何作用。
Java 中守护线程示例:Java 中的垃圾收集(gc)、终结器等。
Java 守护线程的属性
- 当所有用户线程完成执行时,它们不能阻止 JVM 退出。
- 当所有用户线程完成它们的执行时,JVM 终止自己。
- 如果 JVM 找到一个正在运行的守护线程,它会终止该线程,然后关闭它。JVM 不关心守护线程是否在运行。
- 这是一个极低优先级的线程。
守护程序线程的默认性质
默认情况下,主线程始终是非守护进程,但是对于所有剩余的线程,守护进程的性质将从父线程继承到子线程。也就是说,如果父进程是守护进程,那么子进程也是守护进程,如果父进程是非守护进程,那么子进程也是非守护进程。
注意:只要最后一个非守护线程终止,所有守护线程都会自动终止。
守护线程的方法
1. void setDaemon(boolean status):
此方法将当前线程标记为守护线程或用户线程。例如,如果我有一个用户线程 tU,那么 tU.setDaemon(真)将使它成为 Daemon 线程。另一方面,如果我有一个守护线程 tD,那么调用 tD.setDaemon(false)会使它成为一个用户线程。
语法:
public final void setDaemon(boolean on)
参数:
- On: If true, mark this thread as a daemon thread.
异常:
- illegalthreadstateeexception : If only this thread is active.
- SecurityException: If the current thread cannot modify this thread.
2.boolean isDaemon():
此方法用于检查当前线程是否是守护进程。如果线程是守护进程,则返回真。否则,它返回 false。
语法:
public final boolean isDaemon()
返回:
如果此线程是守护程序线程,则此方法返回 true 假不然
爪哇
T0T6】
输出:
t1 is Daemon thread
t3 is Daemon thread
t2 is User thread
守护程序线程中的异常
如果在启动线程后调用 setDaemon()方法,它会抛出illegalthreadstatexception。
爪哇
// 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()方法。
守护进程与用户线程
- 优先级:当进程中剩下的线程只有守护线程时,解释器退出。这是有意义的,因为当只剩下守护线程时,守护线程就不能为其他线程提供服务了。
- 用法:守护线程是为后台支持任务向用户线程提供服务。
本文由 Saket Kumar 供稿。如果你喜欢 GeeksforGeeks 并想投稿,你可以使用write.geeksforgeeks.org写一篇文章或者把你的文章邮寄到 review-team@geeksforgeeks.org。看到你的文章出现在极客博客主页上,帮助其他极客。如果你发现任何不正确的地方,或者你想分享更多关于上面讨论的话题的信息,请写评论。
版权属于:月萌API www.moonapi.com,转载请注明出处