【问题标题】:How can i make the main Thread as Daemon Thread in java?如何在java中将主线程作为守护线程?
【发布时间】:2015-07-01 04:18:57
【问题描述】:

我想将主线程设为守护线程,但它显示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");
    
    }
}

输出

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)

【问题讨论】:

标签: java multithreading daemon


【解决方案1】:

主线程不能设置为守护线程。因为线程可以在运行前设置为守护线程,程序启动后主线程开始运行,因此不能设置为守护线程。

如 javadocs 中给出的...

public final void setDaemon(boolean on)

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

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

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

投掷:

  • IllegalThreadStateException - 如果这个线程还活着

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

【讨论】:

    【解决方案2】:

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

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

    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...
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多