Java: Как запустить поток отдельно от основной программы / класса? - PullRequest
15 голосов
/ 23 октября 2010

Subj. Как запустить поток из основного класса, НО отдельно от этого класса?

Итак, немного подробностей: у меня есть одна программа, которая должна запускать процесс. Этот процесс (cmd one) запускается только когда основная программа завершена и выгружена из памяти. И только после выгрузки основной программы этот процесс начинает свою работу.

Что мне добавить в программу?

Ответы [ 5 ]

31 голосов
/ 24 октября 2010

Если вы имеете в виду: как я могу запустить поток Java, который не закончится, когда моя JVM (Java-программа) завершит работу? .

The answer is: you can't do that.

Потому чтов Java, если JVM завершает работу, все потоки завершаются.Это пример:

class MyRunnable implements Runnable { 
   public void run() { 
       while ( true ) { 
           doThisVeryImportantThing(); 
       } 
   } 
} 

Приведенную выше программу можно запустить из вашего основного потока, например, с помощью следующего кода:

MyRunnable myRunnable = new MyRunnable(); 
Thread myThread = new Thread(myRunnable);
myThread.start(); 

Эта программа примера никогда не остановится, если что-тов doThisVeryImportantThing прервет этот поток.Вы можете запустить его как демон, как в этом примере:

MyRunnable myRunnable = new MyRunnable(); 
Thread myThread = new Thread(myRunnable);
myThread.setDaemon(true); // important, otherwise JVM does not exit at end of main()
myThread.start(); 

Это обеспечит завершение потока main (), а также myThread.

Однако вы можете запустить другую JVM из java, для этого вам может понадобиться проверить этот вопрос: Запустить процесс JVM из приложения Java с помощью Runtime.exec?

5 голосов
/ 24 октября 2010

Создайте отдельный поток, который выполняет вашу внешнюю программу:

class MyRunner implements Runnable{
  public void run(){
     Runtime.exec("your cmd")
  }
}

затем запустите поток в вашем main ():

MyRunner myRunner = new MyRunner(); 
Thread myThread = new Thread(myRunner);
myThread.start();

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

0 голосов
/ 24 октября 2010

Чтобы вызвать процесс, который выживает после завершения JVM, вам нужно использовать Runtime.exec(). Поскольку вы хотите, чтобы он запускался после завершения основного процесса, на самом деле есть два способа сделать это:

1) Если вы хотите, чтобы процесс запускался только во время чистого отключения, вы можете сделать это:

public static void main(String[] args) {
    doThisProgramsStuff();
    spawnSecondProcess();
}

2) Или, если вы хотите, чтобы процесс запускался даже с нечистым завершением работы (или если это приложение с графическим интерфейсом), тогда вы можете добавить обработчик отключения:

public static void main(String[] args) {
    Runtime.getRuntime().addShutdownHook(new Thread() {
        public void run() {
            spawnSecondProcess();
        }
    });
    doThisProgramsStuff();
}

Однако существует проблема со всем этим. Как только JVM завершает работу, дочерний процесс будет иметь стандартный ввод / вывод, ни к чему не привязанный, поэтому он может заполнить свои выходные буферы и блокировать. Вам нужно будет что-то сделать, чтобы убедиться, что этого не произойдет, либо убедившись, что процесс не выводит данные в эти потоки, либо сделав эквивалент Windows для перенаправления в /dev/null.

.
0 голосов
/ 23 октября 2010

Я не совсем уверен, что вы можете создать «отдельный» поток в Java, используя обычные средства реализации Thread и запустить его с помощью run ().

Возможно, вам понадобится форкнуть поток, используя Runtime.exec(), запуск Java как полностью отдельный процесс, а не как поток.

0 голосов
/ 23 октября 2010

Звучит так, как будто вам нужен скрипт, который вызывает первую программу, а затем, когда первая завершается, вызывает другую программу.

Что-то вроде

program1
program2

РЕДАКТИРОВАТЬ: Чтобы запустить две задачи параллельно, вы можете сделать

program1 &
program2

в оболочке bash / unit.

или в дос оболочке

start program1
program2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...