2011-05-12 3 views
4

Je suis nouveau à Java. Je suis chargé d'écrire le programme Java pour exécuter les lignes de commande. J'ai testé la ligne de commande sous l'invite DOS car je n'ai pas encore accès à la machine Linux. ça a bien fonctionné. Voir le PROGRAMME ci-dessous pour la syntaxe complète de la ligne de commande. le travail prendra 6 fichiers d'entrée et génèrera des fichiers de sortie. Ensuite, j'ai essayé de créer une classe et d'utiliser getruntime et le processus pour traiter ce travail. Même compilé sans erreur, mais quand je l'exécute il suffit de montrer le curseur clignotant ... je pensais que j'ai besoin d'utiliser la technique Thread async. S'il vous plaît fournir quelques conseils car je n'ai pas assez de temps pour les projets. Je voudrais également implémenter un rappel ou renvoyer des valeurs lorsque le travail est terminé. un exemple serait grandement apprécié. MerciComment faire pour exécuter la ligne de commande dans Java en utilisant le fil asynchrone

import java.io.*; 
public class RunJob { 

// public static final String PROGRAM = "c:\\wrk\\java.exe Hello"; 

//one command line below 
public static final String PROGRAM = "c:/java.exe -cp \"wrk/jmp.jar;wrk/colt.jar\" gov.lanl.yadas.reliability.UltimateMissileReliabilityModel 10000 \"wrk/\" x1.dat x2c.dat x3.dat x4.dat x5.dat x6.dat true"; 

// Set to true to end the loop 
static boolean done = false; 

public static void main(String argv[]) throws IOException { 

    BufferedReader is; 
    String line; 
    String returnMsg = "Start "; 
    final Process p = Runtime.getRuntime().exec(PROGRAM); 
    System.out.println("start"); 


    Thread waiter = new Thread() { 
     public void run() { 
     try { 
      p.waitFor(); 
     } catch (InterruptedException ex) { 
     System.out.println("InterruptedException"); 
      return; 
     } 
     System.out.println("Program terminated!"); 
     done = true; 
     } 
    }; 
    waiter.start(); 
    is = new BufferedReader(new InputStreamReader(p.getInputStream())); 

    while (!done && ((line = is.readLine()) != null)) 
     { 
     System.out.println(line); 
     returnMsg = returnMsg + line;  
     } 
     System.out.println(returnMsg); 
     System.out.println("End"); 

    return; 
    }// main 


} 

Répondre

3

Je suppose qu'il ya une bonne raison pour laquelle vous voulez exécuter un programme Java à partir d'un autre programme java et non pas seulement à partir d'un script shell, ou en invoquant une API - mais sinon - s'il vous plaît reconsidérer sa décision. En ce qui concerne votre problème - si votre application produit beaucoup de sortie (celle que vous exécutez en tant que processus) - votre application va se bloquer. Le p.waitFor() s'arrêtera jusqu'à la fin du processus. Mais si vous ne lisez pas les informations de la InputStream - il va déborder et se bloquer!

Conseil n ° 1: mettre le p.waitFor() à la fin.
Conseil n ° 2: lisez ceci article. Si je me souviens bien, c'est celui que j'ai lu quand j'ai eu un problème similaire. Vous pouvez également google pour "StreamGobbler" - c'est un nom commun pour un fil séparé qui "gobe" vos flux.
Conseil n ° 3: N'oubliez pas le ErrorStream - si votre application génère trop d'erreurs - ce flux entraînera également le blocage du processus.

Questions connexes