Java:如何从主程序/类中单独运行线程?

时间:2010-10-23 18:02:15

标签: java multithreading parallel-processing

SUBJ。如何从主类BUT中分别从该类运行线程?

所以有一些细节:我有一个程序必须运行一个进程。该进程(一个cmd)仅在主程序完成并从内存中卸载时运行。并且只有在卸载主程序后才开始工作。

我应该在节目中添加什么?

5 个答案:

答案 0 :(得分:31)

如果你的意思是:我怎样才能启动一个在我的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?

答案 1 :(得分:5)

创建一个执行外部程序的单独线程:

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

然后在main()中启动线程:

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

这样你的主程序将继续运行,而你的后台线程将启动一个外部进程并在该程序退出时退出。

答案 2 :(得分:0)

听起来你想要一个调用第一个程序的脚本,然后当第一个程序完成时,它会调用第二个程序。

这样的东西
program1
program2

编辑:要并行运行两个任务,您可以执行

program1 &
program2

在bash / unit shell中。

或在dos shell中

start program1
program2

答案 3 :(得分:0)

我并不完全确定你可以使用实现Thread的常规方法在Java中创建一个'detached'线程并使用run()将其踢掉。

您可能需要使用Runtime.exec()分叉线程,将java作为完全独立的进程运行,而不是作为线程运行。

答案 4 :(得分:0)

要生成在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来实现这一点。