首頁  >  文章  >  Java  >  如何在 Java 中非同步重定向子程序輸出而不阻塞主執行緒?

如何在 Java 中非同步重定向子程序輸出而不阻塞主執行緒?

Barbara Streisand
Barbara Streisand原創
2024-11-12 04:02:02587瀏覽

How to Redirect Subprocess Output Asynchronously in Java Without Blocking the Main Thread?

在不阻塞主執行緒的情況下重定向進程輸出

問題

在Java 應用程式中,如何擷取子程式的stdout 和stderr 輸出使用ProcessBuilder 啟動並非同步重定向到System.out,允許子進程和輸出重定向在背景執行?

目前的方法是手動建立一個新執行緒來不斷從 stdout 讀取並寫入 System.out ,但是感覺很麻煩,需要額外的執行緒管理。有沒有更優雅的解決方案?

回答

利用 ProcessBuilder.inheritIO,您可以設定子進程的標準 I/O 來鏡像目前 Java 進程的標準 I/O。這會將子程序的輸出直接重定向到 System.out,而不需要單獨的執行緒。

Process p = new ProcessBuilder().inheritIO().command("command1").start();

如果使用Java 7 不可行,另一種選擇是使用線程手動重定向:

public static void main(String[] args) throws Exception {
    Process p = Runtime.getRuntime().exec("cmd /c dir");
    inheritIO(p.getInputStream(), System.out);
    inheritIO(p.getErrorStream(), System.err);
}

private static void inheritIO(final InputStream src, final PrintStream dest) {
    new Thread(new Runnable() {
        public void run() {
            Scanner sc = new Scanner(src);
            while (sc.hasNextLine()) {
                dest.println(sc.nextLine());
            }
        }
    }).start();
}

此方法利用線程,當子進程完成時,當輸入/錯誤流到達末端時,執行緒會自動終止。

以上是如何在 Java 中非同步重定向子程序輸出而不阻塞主執行緒?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn