Maison > Java > javaDidacticiel > Comment rediriger la sortie du sous-processus de manière asynchrone en Java sans bloquer le thread principal ?

Comment rediriger la sortie du sous-processus de manière asynchrone en Java sans bloquer le thread principal ?

Barbara Streisand
Libérer: 2024-11-12 04:02:02
original
677 Les gens l'ont consulté

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

Redirection de la sortie du processus sans bloquer le thread principal

Question

Dans une application Java, comment capturer la sortie stdout et stderr d'un sous-processus lancé à l'aide de ProcessBuilder et redirigez-le vers System.out de manière asynchrone, permettant au sous-processus et à la redirection de sortie de s'exécuter dans le background?

L'approche actuelle implique la création manuelle d'un nouveau thread pour lire en continu depuis stdout et écrire sur System.out, mais cela semble fastidieux et nécessite une gestion supplémentaire des threads. Existe-t-il une solution plus élégante ?

Réponse

En tirant parti de ProcessBuilder.inheritIO, vous pouvez définir les E/S standard du sous-processus pour qu'elles reflètent celles du processus Java actuel. Cela redirige la sortie du sous-processus directement vers System.out sans nécessiter de thread séparé.

Process p = new ProcessBuilder().inheritIO().command("command1").start();
Copier après la connexion

Si l'utilisation de Java 7 n'est pas réalisable, une autre option consiste à rediriger manuellement à l'aide de threads :

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();
}
Copier après la connexion

Cette approche utilise des threads qui se terminent automatiquement lorsque le sous-processus est terminé, lorsque les flux d'entrée/d'erreur atteignent leur fin.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal