Java中的守护线程

Java中的守护进程线程是一个低优先级线程,在后台运行以执行垃圾收集等任务。Java中的守护进程线程也是一个向用户线程提供服务的服务提供者线程。它的生命取决于用户线程的命运,也就是说,当所有用户线程都死掉时,JVM会自动终止这个线程。

null

简单地说,我们可以说它为后台支持任务的用户线程提供服务。它除了为用户线程服务之外,在生活中没有任何作用。

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()方法。

守护进程与用户线程

  1. 优先: 当进程中唯一剩下的线程是守护进程线程时,解释器将退出。这是有意义的,因为当只剩下守护进程线程时,就没有其他线程可以由守护进程线程提供服务。
  2. 用法: 守护进程线程是为后台支持任务的用户线程提供服务。

本文由 萨凯特·库马尔 .如果你喜欢GeekSforgek,并想贡献自己的力量,你可以使用 写极客。组织 或者把你的文章寄去评论-team@geeksforgeeks.org.看到你的文章出现在Geeksforgeks主页上,并帮助其他极客。如果您发现任何不正确的地方,或者您想分享有关上述主题的更多信息,请写下评论。

© 版权声明
THE END
喜欢就支持一下吧
点赞10 分享