Как запустить поток отдельно от основного потока в 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.