Rumah  >  Artikel  >  Java  >  Bagaimana untuk Mengalihkan Output Subproses Secara Asynchronous di Java Tanpa Menyekat Benang Utama?

Bagaimana untuk Mengalihkan Output Subproses Secara Asynchronous di Java Tanpa Menyekat Benang Utama?

Barbara Streisand
Barbara Streisandasal
2024-11-12 04:02:02587semak imbas

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

Mengubah Hala Keluaran Proses Tanpa Menyekat Benang Utama

Soalan

Dalam aplikasi Java, bagaimana seseorang boleh menangkap output stdout dan stderr subproses dilancarkan menggunakan ProcessBuilder dan ubah halanya ke System.out secara tidak segerak, membenarkan subproses dan pengalihan keluaran berjalan di latar belakang?

Pendekatan semasa melibatkan penciptaan utas baharu secara manual untuk terus membaca dari stdout dan menulis ke System.out , tetapi ia terasa menyusahkan dan memerlukan pengurusan benang tambahan. Adakah terdapat penyelesaian yang lebih elegan?

Jawapan

Dengan memanfaatkan ProcessBuilder.inheritIO, anda boleh menetapkan I/O standard subproses untuk mencerminkan proses Java semasa. Ini mengubah hala output subproses terus ke System.out tanpa memerlukan urutan yang berasingan.

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

Jika menggunakan Java 7 tidak boleh dilaksanakan, pilihan lain ialah mengubah hala secara manual menggunakan benang:

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();
}

Pendekatan ini menggunakan urutan yang ditamatkan secara automatik apabila subproses selesai, apabila aliran input/ralat mencapai penghujungnya.

Atas ialah kandungan terperinci Bagaimana untuk Mengalihkan Output Subproses Secara Asynchronous di Java Tanpa Menyekat Benang Utama?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn