我想问一下线程启动之前的setDaemon(false)是否多余(在构造函数中已经是setDaemon(false)),否则没有什么区别?
我还是从某个网站复制了此代码。

import java.lang.*;

class adminThread extends Thread {

   adminThread() {
   setDaemon(false);
   }

   public void run() {
   boolean d = isDaemon();
   System.out.println("daemon = " + d);
   }
}

public class ThreadDemo {

  public static void main(String[] args) throws Exception {

   Thread thread = new adminThread();
   System.out.println("thread = " + thread.currentThread());
   thread.setDaemon(false);

   // this will call run() method
   thread.start();
  }
}


这是我从以下地址获得的代码:https://www.tutorialspoint.com/java/lang/thread_setdaemon.htm

谢谢并恭祝安康。

最佳答案

线程启动之前的setDaemon(false)是多余的(在构造函数中已经是setDaemon(false))还是不是多余的,如果有什么区别?


这不是多余的。线程从创建它的父线程的守护程序状态获取其守护程序标志。创建adminThread的线程可能已经是守护程序线程,因此如果需要强制将其设为不是守护程序,则需要显式设置它。

通过Thread.init(...)方法:

Thread parent = currentThread();
...
this.daemon = parent.isDaemon();


因此,如果您希望某个线程成为守护进程,或者不希望该线程成为守护进程,则应在调用start()之前专门对其进行设置。

关于代码的其他一些注释。类应以大写字母开头,因此应为AdminThread。还建议实现Runnable而不是扩展Thread,因此它实际上应该是AdminRunnable。因此,代码如下所示:

class AdminThread implements Runnable {
    // no constructor needed
    public void run() {
       ...
    }
}
...
Thread thread = new Thread(new AdminThread());
thread.setDaemon(false);
thread.start();

07-26 05:31