【问题标题】:setDaemon(false) is redundant?setDaemon(false) 是多余的吗?
【发布时间】:2017-01-22 07:14:00
【问题描述】:

想问一下线程启动前的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

感谢和问候。

【问题讨论】:

  • 在这个例子中,它们在技术上是 both 冗余的,因为默认情况下这个线程不会是守护进程。

标签: java multithreading daemon


【解决方案1】:

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

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

来自Thread.init(...) 方法:

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

因此,如果您希望线程成为守护进程或不明确,您应该在调用start() 之前专门设置它。

关于代码的其他几个 cmets。类应以大写字母开头,因此应为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();

【讨论】:

    【解决方案2】:

    这是多余的,除非您正在编写一些从未知来源获取 Thread 对象的并发框架。在这种情况下,您可能需要执行该调用以确保它不是守护进程。

    【讨论】:

      猜你喜欢
      • 2016-01-07
      • 2018-04-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-11
      • 1970-01-01
      • 2023-03-20
      相关资源
      最近更新 更多