我正在编写一个有两个线程的应用程序: [1]主要 [2] threadX
主线程是命令行程序并在后台启动应用程序(mongodb)然后退出。
threadX是我的应用程序的服务器部分,只要应用程序(mongodb)正在运行,它就需要处于活动状态。
main有两个参数:start和stop。
开始时:它开始 - >启动mongod和threadX。
停止:它开始 - >杀死mongod并且(应该)停止threadX。
但即使将threadX设置为守护进程,它也会在主线程退出后停止。
证明:
public class Index {
public static void main(String [] args) {
Logger log = Logger.getLogger("Index logging");
try {
FileHandler logfile = new FileHandler("test.log");
logfile.setFormatter(new SimpleFormatter());
log.addHandler(logfile);
} catch (SecurityException | IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Thread daemonThread = new Thread() {
public void run() {
while (true) {
try {
log.log(Level.INFO,"Try block executed");
Thread.sleep(1000l);
} catch (Throwable t) {
t.printStackTrace();
}
}
}
@Override
public void finalize() {
log.log(Level.INFO,"Finalize method called");
}
};
daemonThread.setDaemon(true);
daemonThread.start();
try {
Thread.sleep(3500l);
} catch (Throwable t) {
//NO-OP
}
}
}
输出:
Apr 08, 2017 2:30:54 PM num.Index$1 run
INFO: Try block executed
Apr 08, 2017 2:30:55 PM num.Index$1 run
INFO: Try block executed
Apr 08, 2017 2:30:56 PM num.Index$1 run
INFO: Try block executed
Apr 08, 2017 2:30:57 PM num.Index$1 run
INFO: Try block executed
正如您所看到的那样,在主要退出后不会继续写日志
我想要的是一个可以在后台启动的线程,即使主线程退出也可以继续运行,并且在重新启动应用程序后该线程可以停止。就像控制台应用程序一样,它在后台启动进程并退出,让控制台可供用户使用。然后,用户可以使用命令来停止该后台进程。
答案 0 :(得分:2)
main
方法后,守护程序线程执行退出 - 如果您不希望线程退出,则不使其成为守护程序线程。< / p>
删除行
daemonThread.setDaemon(true);
或将其更改为
daemonThread.setDaemon(false);
来自setDaemon方法的Javadoc:
当运行 的唯一线程 时,Java虚拟机退出 守护程序主题。
答案 1 :(得分:0)
创建用户线程而不是守护程序线程。为什么需要将Thread设置为Daemon?
JVM不会终止用户线程,它会在退出之前等待它完成,而不像守护程序线程。
希望这有助于
答案 2 :(得分:0)
如果我对你想要完成的事情做好准备:你想要一个程序来控制mongodb。对程序进行单独调用可能会有不同的命令作为命令行参数。
在&#34; start&#34;的情况下:你的应用程序应该启动mongodb作为一个单独的进程,以便它可以在mongodb启动后立即退出。你不需要线程来保持mongodb运行。
在&#34;停止&#34;的情况下:您必须连接到mongodb进程并告诉它正常关闭,等待它结束并结束您自己的程序。