2012-03-08 8 views
1

Я пишу приложение в Java, позволяющее запускать другие приложения. Для этого я использовал объект класса Process, но когда я это делаю, приложение ожидает завершения процесса до выхода из него. Есть ли способ запустить внешнее приложение на Java, но не ждите его завершения?Запустите внешнее приложение в java, но не ждите его завершения.

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

ответ

0

Вы можете запустить его в другом потоке.

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

      } 
     }); 

    } 

Вы можете начать демон нить в зависимости от ваших потребностей:

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

Я думаю, он хотел, чтобы его лайнер закончил после запуска программы. –

2

ProcessBuilder.start(), не дожидаясь завершения процесса. Вы должны вызвать Process.waitFor(), чтобы получить это поведение.

Я сделал небольшой тест с этой программой

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

При запуске в NetBeans он появляется, чтобы быть по-прежнему работает. При запуске из командной строки с java -jar он немедленно возвращается.

Значит, ваша программа, вероятно, не ждет выхода, но ваша среда ID делает это так.

+0

Как насчет того, когда ProcessBuilder запускается внутри цикла. Ожидает ли завершения завершения следующего цикла? – sijo0703

+0

Если вы используете waitFor(), он будет. –