如何创建守护程序线程?什么?

时间:2013-10-17 07:49:08

标签: java multithreading

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

它们用于什么?我该如何使用它们? 此外,我试图创建守护进程,但我不能。

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 个答案:

答案 0 :(得分:50)

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

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

(diagram)也可能对您有所帮助。 from arashmd.blogspot.com

答案 1 :(得分:8)

Thread.setDaemon()的javadoc说:

  

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

     

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

     

此方法首先调用此线程的checkAccess方法,不带参数。这可能导致抛出SecurityException(在当前线程中)。

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

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

答案 2 :(得分:4)

必须在启动线程

之前设置守护程序状态

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

答案 3 :(得分:3)

  1. 守护进程线程并不邪恶(虽然从技术上讲它们可以做坏事 的东西)。
  2. 启动后无法创建线程守护程序。
  3. 您将使用守护程序线程作为后台线程 不得/不需要阻止程序关闭。