在Java中运行可执行文件的陷阱

时间:2016-11-14 09:08:01

标签: java

我正在尝试使用java运行unix可执行文件。

我有一个可供数千名用户访问的用户界面。 可执行文件可以通过按钮触发。

我看了几个例子: Java Programming: call an exe from Java and passing parameters

使用建议的方法有哪些瓶颈?

例如,如果用户单击按钮并运行可执行文件,是否会影响第二个用户的性能?

或者,如果他们同时按下按钮,会发生什么?

或者我怎么知道执行是否完成(我不认为操作系统会为我管理)。

1 个答案:

答案 0 :(得分:1)

  

使用建议的方法有哪些瓶颈?

最大的问题是您的硬件和可执行文件本身。如果可执行文件在一段时间后自行完成,那么你应该没问题。您不希望1000个进程等待某些事情完成。您还需要在进程启动后监视这些进程,并在进程超时时将其终止。另一个考虑因素是限制每个用户的并发进程数。

  

例如,如果用户单击按钮并运行可执行文件,是否会影响第二个用户的性能?

不直接。见上文。

  

或者,如果他们同时按下按钮,会发生什么?

如果每次都在新线程(或任务调度程序)上启动进程,则不执行任何操作。每次按下按钮,都会启动一个新进程。

  

或者我怎么知道执行是否完成(我不认为操作系统会为我管理)。

以下是一个例子:

String command = "PATH_TO_EXECUTABLE/EXECUTABLE PARAMS ";
log.info("Executing command - " + command);
// Executing the command
Process process;
ArrayList<String> outLines = new ArrayList<String>();
try {
  process = Runtime.getRuntime().exec(command);

  // Getting the results
  process.getOutputStream().close();
  String line;
  log.info("Standard Output:");
  BufferedReader stdout = new BufferedReader(new InputStreamReader(
      process.getInputStream()));

  while ((line = stdout.readLine()) != null) {
    log.info(line);
    outLines.add(line);
  }

  stdout.close();
  log.info("Standard Error:");
  BufferedReader stderr = new BufferedReader(new InputStreamReader(
      process.getErrorStream()));
  while ((line = stderr.readLine()) != null) {
    log.info(line);
  }
  stderr.close();
  log.info("Done");

} catch (IOException e) {
  log.error("Error while exceuting command", e);
}
String result = outLines.get(outLines.size()-1);
//TODO do something with the results
//at this point the process has finished executing