簡體   English   中英

JVM在Java中退出后如何運行線程?

[英]How to run a thread after JVM exits in java?

我正在編寫一個有兩個線程的應用程序:[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

如您所見,它在主出口退出后不會繼續寫日志

我想要的是一個可以在后台啟動並且即使在主線程退出時也可以繼續運行的線程,並且在我重新啟動應用程序后可以停止該線程。 就像控制台應用程序一樣,該應用程序在后台啟動進程並退出,從而使控制台可供用戶使用。 然后,用戶可以使用命令停止該后台進程。

守護線程退出后main方法退出-如果你不想讓你的線程退出,你應該使它成為一個守護線程。

刪除線

daemonThread.setDaemon(true);

或將其更改為

daemonThread.setDaemon(false);

從setDaemon方法的Javadoc中:

當僅運行所有線程都是守護程序線程時,Java虛擬機將退出。

創建一個用戶線程而不是一個守護線程。 為什么需要將Thread設置為Daemon?

JVM不會終止用戶線程,而是會等待它完成,然后退出,這不同於Daemon線程。

希望這可以幫助

如果我正確地理解了您要實現的目標:您想要一個程序來控制mongodb。 程序的單獨調用可能具有不同的命令作為其命令行參數。

在“啟動”的情況下:您的應用程序應作為單獨的進程啟動mongodb,以便它可以在mongodb啟動后立即退出。 您不需要線程來保持mongodb的運行。

在“停止”的情況下:您必須連接到mongodb進程,並告訴它正常關閉,等待其結束並結束您自己的程序。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM