18

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

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

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) {
        }
    }
}

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

4

4 回答 4

55

首先,您需要在启动它之前将一个线程设置为守护进程,所以第一件事是这样的:

 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 秒后不再存在,那么守护线程永远不会到达第二个睡眠线。

这个(图表)也可以帮助你。 来自 arashmd.blogspot.com

于 2013-10-17T07:52:27.543 回答
10

javadocThread.setDaemon(boolean)说:

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

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

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

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

于 2013-10-17T07:50:31.037 回答
5
  1. 守护线程并不邪恶(尽管从技术上讲它们可以做邪恶的事情)。
  2. 启动后不能创建线程守护程序。
  3. 您将使用守护线程作为后台线程,它不能/不需要阻止程序关闭。
于 2013-10-17T07:52:02.873 回答
5

必须在启动线程之前设置守护进程状态

守护线程是一个线程,当程序完成但线程仍在运行时,它不会阻止 JVM 退出。一个守护线程的例子是垃圾回收。

于 2013-10-17T07:52:52.987 回答