【发布时间】:2011-04-29 15:41:33
【问题描述】:
目标是能够从主类中调用单独线程的执行。
一些上下文: 我有一个必须运行进程的程序。 进程(一个 cmd 进程) 应该仅在主程序执行完毕并从内存中卸载时运行。
我应该在主类中包含哪些代码?
【问题讨论】:
-
我知道这已经晚了,但您是否将
ProcessBuilder视为不同的选项?
标签: java multithreading parallel-processing
目标是能够从主类中调用单独线程的执行。
一些上下文: 我有一个必须运行进程的程序。 进程(一个 cmd 进程) 应该仅在主程序执行完毕并从内存中卸载时运行。
我应该在主类中包含哪些代码?
【问题讨论】:
ProcessBuilder 视为不同的选项?
标签: java multithreading parallel-processing
如果您的意思是:如何启动一个不会在我的 JVM(Java 程序)结束时结束的 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。
但是,您可以从 java 启动不同的 JVM,为此您可能需要查看以下问题: Launch JVM process from a Java application use Runtime.exec?
【讨论】:
创建一个单独的线程来执行你的外部程序:
class MyRunner implements Runnable{
public void run(){
Runtime.exec("your cmd")
}
}
然后在你的 main() 中启动线程:
MyRunner myRunner = new MyRunner();
Thread myThread = new Thread(myRunner);
myThread.start();
这样您的主程序将继续运行,而您的后台线程将启动一个外部进程并在该程序退出时退出。
【讨论】:
我不完全确定您是否可以使用实现 Thread 的常规方法在 Java 中创建一个“分离”线程并使用 run() 启动它。
您可能需要使用 Runtime.exec() 派生一个线程,将 java 作为完全独立的进程而不是作为线程运行。
【讨论】:
top &
要生成一个在 JVM 终止后仍然存在的进程,您需要使用 Runtime.exec()。由于您希望它在您的主进程结束后运行,因此您可以通过两种方式实现它:
1) 如果您只想处理在干净关机期间运行,那么您可以这样做:
public static void main(String[] args) {
doThisProgramsStuff();
spawnSecondProcess();
}
2) 或者,如果您希望进程在不正常关闭的情况下运行(或者如果它是一个 GUI 应用程序),那么您可以添加一个关闭挂钩:
public static void main(String[] args) {
Runtime.getRuntime().addShutdownHook(new Thread() {
public void run() {
spawnSecondProcess();
}
});
doThisProgramsStuff();
}
然而,这一切都存在问题。一旦 JVM 终止,子进程将没有附加标准输入/输出,因此它可能会填充它的输出缓冲区并阻塞。您需要做一些事情来确保不会发生这种情况,方法是确保进程不会向这些流产生输出,或者执行 Windows 等效的重定向到 /dev/null。
【讨论】:
听起来你想要一个调用第一个程序的脚本,然后当第一个程序完成时,它会调用第二个程序。
类似
program1
program2
编辑:要并行运行这两个任务,您可以这样做
program1 &
program2
在 bash/unit shell 中。
或在dos shell中
start program1
program2
【讨论】: