gpt4 book ai didi

java - java中JVM退出后如何运行线程?

转载 作者:行者123 更新时间:2023-12-02 02:54:44 24 4
gpt4 key购买 nike

我正在编写一个有两个线程的应用程序:[1] 主要[2] 线程X

主线程是命令行程序,在后台启动一个应用程序(mongodb)然后退出。

threadX 是我的应用程序的服务器部分,只要应用程序(mongodb)正在运行,它就需要处于 Activity 状态。

main 有两个参数:开始和停止。

启动时:它启动 -> 启动 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

如您所见,main退出后它不会继续写入日志

我想要的是一个可以在后台启动并继续运行的线程,即使主线程退出,并且该线程可以在我重新启动应用程序后停止。就像控制台应用程序一样,它在后台启动进程并退出,让控制台可供用户使用。然后,用户可以使用命令来停止该后台进程。

最佳答案

守护线程domain方法退出后退出 - 如果您不希望线程退出,则不应该将其设置为守护进程线程。

删除该行

daemonThread.setDaemon(true);

或将其更改为

daemonThread.setDaemon(false);

来自 setDaemon 方法的 Javadoc:

The Java Virtual Machine exits when the only threads running are all daemon threads.

关于java - java中JVM退出后如何运行线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43295220/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com