想问一下在线程启动之前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
感谢和问候。
答案 0 :(得分:1)
这是多余的,除非您正在编写一些从未知来源获取Thread对象的并发框架。在这种情况下,您可能希望进行该调用以确保它不是守护进程。
答案 1 :(得分:1)
是线程启动之前的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();