簡體   English   中英

一段時間后殺死Java

[英]java killing process after a period of time

我的代碼是這樣的:

        Runtime rt = Runtime.getRuntime();
        // cmd == "cmd.exe /C java =Xms2M =Xmx16M Sth" 
        Process proc = rt.exec(cmd);

現在,我想在一秒鍾后終止此過程,並將其輸出和錯誤轉換為字符串變量。

怎么做 ?

就我而言:我在編譯類Sth中有一個不定式循環。 我正在啟動它,然后一秒鍾后我想殺死它。

//我正在Win XP,然后是Debian上對其進行測試。

蒂茲

這將有點棘手,因為一旦終止該進程,其輸出將不再可用,因此您必須在終止它之前先獲取該輸出。

Thread.sleep(1000); 
InputStream in = proc.getInputStream();
byte[] data = new byte[in.available()];
in.read(data);
proc.destroy();

這是假設該過程在此期間不會自行關閉。 如果是這樣,InputStream將無法使用,並且您希望自己一直在讀取數據,而不是不停地搖晃手指。

您一定要使此異常安全- proc.destroy的調用放在一個finally處理程序中,以確保終止子進程。

Runtime rt = Runtime.getRuntime();
// cmd == "cmd.exe /C java =Xms2M =Xmx16M Sth" 
Process proc = rt.exec(cmd);

(您的cmd中有一個錯字,您寫的是“ = Xms2M”而不是“ -Xms2M”,與“ -Xmx16M”相同)。

永遠不要這樣調用Runtime.exec:您必須將“ c​​md”分割成一個數組,否則會遇到很多問題。 像這樣做:

String[] sar = { "cmd.exe", "/C", "java", "-Xms2M", "-Xmx16M", "Sth" };
Runtime.getRuntime().exec( sar );

這也可以幫助您:

private static String runCommand(boolean debug, String... script) throws IOException, InterruptedException {
    Runtime rt = Runtime.getRuntime();
    Process process = rt.exec(script);
    BufferedReader reader = null;
    try {
        reader = new BufferedReader(new InputStreamReader(process.getInputStream(), StreamReaderUtil.UTF8));
        Thread.sleep(1000);
        StringBuilder queryExe = new StringBuilder();
        try {
            String str;
            while(reader.ready() && (str = reader.readLine()) != null) {
                queryExe.append(str).append("\n");
            }
        } catch(IllegalThreadStateException e) {
            Thread.sleep(250);
        }
        // FIXME: Replace with a Logger
        if(debug) {
            System.out.println("Executing : " + script);
            System.out.println("Result    : " + queryExe);
        }
        return queryExe.toString();
    } finally {
        if(process != null) {
            process.destroy();
        }
        if(reader != null) {
            reader.close();
        }
    }
}

您可以使用ProcessBuilder返回一個Process對象,並使用它的destroy()方法。

暫無
暫無

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

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