2012-03-08 1 views
1

J'écris une application en java me permettant d'exécuter d'autres applications. Pour ce faire, j'ai utilisé un objet de classe Process, mais quand je le fais, l'application attend le processus pour se terminer avant de se quitter. Existe-t-il un moyen d'exécuter une application externe en Java, mais n'attendez pas qu'il se termine?Exécuter une application externe en Java mais n'attendez pas qu'elle se termine

public static void main(String[] args) 
{ 
FastAppManager appManager = new FastAppManager(); 
appManager.startFastApp("notepad"); 
} 

public void startFastApp(String name) throws IOException 
{ 
    Process process = new ProcessBuilder(name).start(); 
} 

Répondre

0

Vous pouvez l'exécuter dans un autre thread.

public static void main(String[] args) { 
     FastAppManager appManager = new FastAppManager(); 
     appManager.startFastApp("notepad"); 
    } 

    public void startFastApp(final String name) throws IOException { 
     ExecutorService executorService = Executors.newSingleThreadExecutor(); 
     executorService.submit(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        Process process = new ProcessBuilder(name).start(); 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } 

      } 
     }); 

    } 

Vous pouvez commencer un thread démon en fonction de vos besoins:

ExecutorService executorService = Executors.newSingleThreadExecutor(new ThreadFactory() { 
     @Override 
     public Thread newThread(Runnable runnable) { 
      Thread thread = new Thread(); 
      thread.setDaemon(true); 
      return thread; 
     } 
    }); 
+0

Je pense qu'il voulait que son propriétaire se termine après le lancement du programme. –

2

ProcessBuilder.start() ne pas attendre pour le processus pour terminer. Vous devez appeler Process.waitFor() pour obtenir ce comportement.

J'ai fait un petit test avec ce programme

public static void main(String[] args) throws IOException, InterruptedException { 
    new ProcessBuilder("notepad").start(); 
} 

Lorsqu'il est exécuté dans NetBeans, il semble être encore en cours d'exécution. Lors de l'exécution à partir de la ligne de commande avec java -jar, il retourne immédiatement.

Donc, votre programme n'attend probablement pas de sortir, mais votre IDE le fait croire.

+0

Que diriez-vous lorsque ProcessBuilder s'exécute dans une boucle. Attend-il que l'achèvement passe à la prochaine boucle? – sijo0703

+0

Si vous utilisez waitFor(), cela sera le cas. –

Questions connexes