ProcessBuilder et Processus.waitFor(), combien de temps faut-ist attendre?
Je suis de l'exécution d'une .fichier exe à partir de java, à l'aide de la ProcessBuilder classe et la Processus classe. Pour expliquer ce que je fais:
builder = new ProcessBuilder(commands);
builder.redirectErrorStream(true);
Process process = builder.start();
process.waitFor();
Je voulais juste savoir, combien de temps est "waitFor()" en attente? Est-ce qu'il attend jusqu'à ce que mes .exe est exécutée, ou est-ce qu'il attend jusqu'à ce que son exécution est terminée?
Mon .exe est compilé AutoIt script. Cela signifie qu'il pourrait y avoir des interactions, tels que les mouvements de la souris, ce qui prend un certain temps.
J'ai donc besoin de savoir si mon Java-exécution de code qui se passe après l'appel de la .exe ou si il est vraiment en attente pour elle.
Ce que je veux réaliser est la rotation de l'exécution de deux scripts, mais j'ai peur que mon code Java est l'exécution de la deuxième script alors que le premier est toujours en cours d'exécution.
Quelqu'un a une solution pour cela? Je suis content de toutes les idées.
- Je cite les docs: "le thread actuel attendre, si nécessaire, jusqu'à ce que le processus représenté par cet objet Processus a pris fin. Cette méthode retourne immédiatement si le sous-processus est déjà terminé.".
- Jetez un oeil à quand-runtime-exec---remporte-t. Il y a une bonne description de la
Process.waitFor()
cas d'utilisation.
Vous devez vous connecter pour publier un commentaire.
Votre thread d'exécution sera bloqué sur
process.waitFor()
jusqu'à ce que le processus est terminé (c'est à dire l'exécution fini).Source ici
Également noter que si le processus est déjà terminé : waitFor() ne sera pas bloqué. Je ne sais pas si le code que vous mettez dans votre question, c'est exactement ce que vous exécutez... mais vous devez être prudent et de re-créer une nouvelle instance de Processus pour chaque exécution de votre script (c'est à dire pas seulement l'appel de démarrer plusieurs fois sur le même Processus: il ne fonctionne pas après la première exécution)
En outre, Si il y a des sorties dans les "commandes". vous devriez lire la sortie standard et la sortie d'erreur standard par
stream(process.getErrorStream())
etprocess.getInputStream())
.Si non, et de la sortie ou de sortie d'erreur complète, lawaitfor()
serait pendu.Il attendra que le processus est terminé. Solution de contournement:
1 Utilisation isAlive()
2 Utilisez waitFor(délai long, TimeUnit unit) (1.8)