Java 从作为后台作业运行的shell脚本生成进程

Java 从作为后台作业运行的shell脚本生成进程,java,multithreading,shell,Java,Multithreading,Shell,我正在开发一个web应用程序,其中前端运行Java,后端运行shell脚本。该应用程序主要用于分析多个文件,java程序从用户处获取输入,例如他们要分析的文件,从哪个日期到他们要分析的日期。我需要处理8天的文件。每天大约有100个文件需要处理。所以我的目标是使这个过程并行进行,而不是按顺序进行。关于这一点,我基本上有两个想法。我想和你们分享这个ppl,并得到你们的建议 计划1: 有一个Java程序(业务层),它使用process builder调用shell脚本。我可以按用户将给定的日期(例如(

我正在开发一个web应用程序,其中前端运行Java,后端运行shell脚本。该应用程序主要用于分析多个文件,java程序从用户处获取输入,例如他们要分析的文件,从哪个日期到他们要分析的日期。我需要处理8天的文件。每天大约有100个文件需要处理。所以我的目标是使这个过程并行进行,而不是按顺序进行。关于这一点,我基本上有两个想法。我想和你们分享这个ppl,并得到你们的建议

计划1: 有一个Java程序(业务层),它使用process builder调用shell脚本。我可以按用户将给定的日期(例如(1-8))拆分为4个线程,每个线程将执行两天的操作。例如(1-2)线程1和(3-4)线程2,它继续。如果我遵循这种方法,所有的优点和缺点是什么。还讨论了如何通过这种方法在线程之间进行协调

计划2: 从Java调用shell脚本,在shell脚本中生成多个进程,正如我前面所说的,我可以生成进程1来完成日期(1-2)和进程2(3-4)的工作,然后继续。这种方法的优缺点是什么。我将处理后的输出写入一个文件。因此,如果我有多个进程,如何通过多个进程更新单个文件

还有与我的问题相关的任何链接的任何参考

重要:
正如我所说,我需要在shell脚本中每天处理100个日志文件,我的要求之一是不断更新前端环境,了解shell脚本中我的作业状态(即第1天已完成,第2天已完成等等)。我知道我可以从shell脚本中执行echo,然后我可以从Java中获得值。但问题是,如果我在shell脚本中,在处理文件的循环中执行echo,我的调用就会终止,我必须再次从Java调用。关于如何实现此更新的任何想法。

首先,我建议考虑优化的第一条规则:不要优化

如果您真的认为需要对其进行优化,我会选择第一种方法,并尽可能多地使用Java

一种方法可以是: 1) 使用ProcessBuilder运行所有进程并创建一个
列表
2) 将每个进程包装到ShellScriptProcess中,并获取
列表

3) 等待进程完成

while(!allFinished) {
    for (ShellScriptProcess sp : shellScriptProcesses) {
      allFinished = true;
      if (sp.isFinished()) {
          // hurray, a process has finished, inform the UI
          // you want to do something smarter here though, 
          //like removing the finished processes from the list
      }
      else {
          allFinished = false;
      }
   }
}

这只是一个非常粗略的解决方案,只是为了演示如何实现这一点。我没有测试代码,它可能包含语法错误:)希望这有帮助。

为什么需要使用shell脚本?我正在处理其中的文件谢谢您的解决方案。只是想知道这是否会从Java环境本身产生多个进程。列表和列表将出现在何处…ProcessBuilder将生成多个进程。首先,您必须创建一个循环,生成所有进程,并将它们放入列表中。进程p=ProcessBuilder.start();添加(新的ShellScriptProcess(p))。实际上,在这种情况下,您甚至不需要进程类的列表。是的,这是我的问题。。。。我也在想。。我可以编辑代码吗?你能确保它是正确的吗?
while(!allFinished) {
    for (ShellScriptProcess sp : shellScriptProcesses) {
      allFinished = true;
      if (sp.isFinished()) {
          // hurray, a process has finished, inform the UI
          // you want to do something smarter here though, 
          //like removing the finished processes from the list
      }
      else {
          allFinished = false;
      }
   }
}