如何在Java中将主线程作为守护程序线程?

时间:2015-07-01 04:18:57

标签: java multithreading daemon

我想将主线程作为守护程序线程,但它会显示IllegalThreadStateException。 有没有办法做到这一点?

public class DeamonThreads {

    public static void main(String[] args) {
        System.out.println("Main Started");
        System.out.println("Thread type deamon = " + Thread.currentThread().isDaemon());
        Thread.currentThread().setDaemon(true);
        System.out.println("Thread type deamon = " + Thread.currentThread().isDaemon());
        System.out.println("Main End");

    }
}
Output

Main Started
Thread type deamon = false
Exception in thread "main" java.lang.IllegalThreadStateException
    at java.lang.Thread.setDaemon(Thread.java:1367)
    at com.threads.DeamonThreads.main(DeamonThreads.java:8)

2 个答案:

答案 0 :(得分:5)

主线程无法设置为守护程序线程。因为线程可以在运行之前设置守护进程,并且一旦程序启动,主线程就开始运行,因此不能设置为守护进程线程。

在javadocs中给出...

public final void setDaemon(boolean on)

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

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

参数:     on - 如果true,则将此线程标记为守护程序线程

抛出:

  • IllegalThreadStateException - 如果这个帖子还活着

  • SecurityException - 如果checkAccess()确定当前 线程无法修改此线程。

答案 1 :(得分:1)

正如其他人已经指出的那样,你不能这样做,但是你要解决的真正的问题是什么?

主线程没有什么特别之处,为什么不摆脱它呢?这对你有用吗?

public static void main(String[] args) {
    ...create at least one non-daemon thread...
    Thread t = new Thread(() -> {
        daemon_main(args);
    });
    t.setDaemon(true);
    t.start();
}

public static void daemon_main(String[] args) {
    ...do whatever else main() did...
}