如何创建守护进程线程?为了什么?

2022-09-02 14:19:08

我无法理解守护进程线程的用法和目的。

他们是干什么的?我该如何使用它们?另外,我试图创建守护进程,但我不能。

class Evil implements Runnable {
    public static void main(String[] arg) throws Exception {
        Thread t = new Thread(new Evil());
        t.start();
        Thread.sleep(1000);
        t.setDaemon(true);//no success, error!
    }

    public void run() {
        try {
            Thread.sleep(1000);
            System.out.println("How would it be Evil!?");
            Thread.sleep(1000);
        } catch (Exception e) {
        }
    }
}

这是我到目前为止尝试过的,但它不能正常工作。


答案 1

首先,您需要在启动线程之前将其设置为守护程序,因此第一件事如下所示:

 Thread t = new Thread(new Evil());
 t.setDaemon(true);//success is here now
 t.start();
 Thread.sleep(1000);

守护进程线程类似于普通(用户)线程,但有很大的区别。当不存在用户线程(活动)时,JVM 会杀死(暂停)应用程序,换句话说,如果您有 1 个用户线程(例如主线程)和 1000 个守护进程线程,则 JVM 会在应用程序中看到一个线程,并在主线程完成其工作后立即终止应用程序。

这些线程非常适合在后台处理或执行一些业务逻辑,直到其他用户线程处于活动状态,并且要注意使用守护进程线程更改任何内容,因为在JVM停止线程之前没有任何信号。

所以在你的例子中,守护进程线程等待1秒并说些什么,然后再次休眠1秒,因为这是守护进程,主线程在1秒后不再存在,那么守护进程线程永远不会到达第二个睡眠线。

这个(图表)也可能对你有所帮助。from arashmd.blogspot.com


答案 2

Thread.setDaemon(boolean) 的 javadoc 说:

将此线程标记为守护程序线程或用户线程。当运行的唯一线程都是守护程序线程时,Java 虚拟机将退出。

必须在启动线程之前调用此方法。

deamon 线程的一个很好的例子是计时器。

如果不再有用户线程,计时器再次触发是没有意义的。