Запустите внешнее приложение в Java, но не ждите его завершения - PullRequest
1 голос
/ 09 марта 2012

Я пишу приложение на Java, позволяющее запускать другие приложения. Для этого я использовал объект класса Process, но когда я это делаю, приложение ожидает завершения процесса, прежде чем выйти из него. Есть ли способ запустить внешнее приложение в 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(); 
}

Ответы [ 2 ]

3 голосов
/ 09 марта 2012

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

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

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

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

Таким образом, ваша программа, вероятно, не ожидает выхода, но ваша IDE заставляет это выглядеть так.

0 голосов
/ 09 марта 2012

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

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