我想将两个或多个对象作为参数传递给ProcessBuilder,以便将程序作为seprate进程运行。我尝试了以下代码,但它没有用。
public static int exec(FTP ftp, Stage stage) throws IOException,
InterruptedException {
String javaHome = System.getProperty("java.home");
String javaBin = javaHome +
File.separator + "bin" +
File.separator + "java";
String classpath = System.getProperty("java.class.path");
String className = Test.class.getCanonicalName();
ProcessBuilder builder = new ProcessBuilder(
javaBin, "-cp", classpath, className+" "+ftp+" "+stage);
Process process = builder.start();
process.waitFor();
return process.exitValue();
}
这是Test.class
public class Test extends Application
{
String lol = "000";
public Test(FTP ftp, Stage stage)
{
// The logic goes here for those passed parameter
System.out.println("This is Test");
}
@Override
public void start(Stage arg0) throws Exception
{
// TODO Auto-generated method stub
arg0.setTitle("Hello there");
arg0.setWidth(200);
arg0.setHeight(200);
arg0.setScene(new Scene(new Pane(new Label(lol)),1000,1000));
arg0.show();
}
}
这里Test类没有执行但是如果我删除那两个参数那么只有它可以工作。 somene请告诉我如何传递对象作为参数?
答案 0 :(得分:1)
当您启动新流程时,它不会与父流程共享任何数据。这与从命令行调用子进程相同。
您可以为子进程提供的唯一信息是该进程接受(理解)的那些信息作为调用参数和它们必须作为字符串提供。子进程需要解释调用参数并通过解析它们来创建所需的对象。
在您的情况下 - 您需要提供有关ftp
和stage
的所有重要信息,以便新进程可以重新创建实例。即使这样,这些也将是新进程拥有的全新对象,与父进程无关。
答案 1 :(得分:1)
不,你不能跨进程边界传递实例对象(好吧,有共享内存,但你不能在Java中使用它,而且它通常不是C中的正确解决方案)其一)。您可以做的是在进程之间传递消息。命令行参数是一种方式,但正如您所发现的那样,它们仅限于可以序列化为字符串的数据。
另一种选择是序列化您的对象并在子进程中反序列化它们。例如,您可以从父级打开ObjectOutputStream
到子级stdin
,然后通过它发送任意复杂的对象。但是,您在另一侧获得的对象仍然是副本,与父进程中的对象不同。
答案 2 :(得分:0)
ProcessBuilder只能在您希望以seprate进程运行java程序时为您提供帮助。无法将object参数传递给ProcessBuilder。在两个不同的过程之间,您无法直接通过参数。为此,您可以将这些对象存储到文件中,或者可以通过管道传递对象。