Как запустить поток отдельно от основного потока в Java?

Цель состоит в том, чтобы иметь возможность вызывать выполнение отдельного потока из основного класса.

Некоторый контекст: У меня есть программа, которая должна запускать процесс process. Процесс (cmd one) должен запускаться только после завершения основной программы и ее выгрузки из памяти.

Какой код я должен включить в основной класс?

Ответы

Ответ 1

Если вы имеете в виду: , как я могу начать поток 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?

Ответ 2

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

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

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

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

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

Ответ 3

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

Что-то вроде

program1
program2

EDIT: для параллельной работы двух задач вы можете выполнить

program1 &
program2

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

или в оболочке dos

start program1
program2

Ответ 4

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

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

Ответ 5

Чтобы создать процесс, который сохраняется после завершения 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.