如何在JVM退出java后运行一个线程?

时间:2017-04-08 14:20:47

标签: java windows

我正在编写一个有两个线程的应用程序: [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

正如您所看到的那样,在主要退出后不会继续写日志

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

3 个答案:

答案 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进程并告诉它正常关闭,等待它结束并结束您自己的程序。