当前位置: 代码迷 >> java >> 避免安排执行程序创建Java进程的多个实例
  详细解决方案

避免安排执行程序创建Java进程的多个实例

热度:87   发布时间:2023-07-17 20:46:02.0

我创建了一个ScheduledTask,它执行对创建一些xml文件的外部.jar的调用,我希望它每4分钟运行一次。 每次运行外部.jar时,都会创建一个新实例,但我希望它关闭现有实例并创建一个新实例。

基本上这是我的代码:

private static void RunInvoiceProcesses(Properties props) {
ScheduledExecutorService executorService =  
Executors.newScheduledThreadPool(executorService.scheduleAtFixedRate(new 
Runnable() {
        @Override
        public void run() {

          Runtime.getRuntime().exec("cmd /c call C:\\creinvoice\\XMLGen\\runxmlgen.bat");


        }
},
15,
240,
TimeUnit.SECONDS);

//.bat只需调用java -jar myapp.jar

那是一次只能运行一个实例的实例。 每次运行此runnable时,它都会调用bat并由JVM创建一个新实例。

我尝试在执行程序外部创建Process的实例,并执行类似的操作

Process xmlGeneration = null;

  Runnable() {
        @Override
        public void run() {
    if (xmlGeneration.stillAlive()){xmlGeneration.Destroy();}
         xmlGeneration= Runtime.getRuntime().exec("cmd /c call C:\\creinvoice\\XMLGen\\runxmlgen.bat");


        }
}

但似乎您只能将最终变量带入可运行对象,因此这是不可能的。 当然,我已尽一切努力对此进行了研究,但是,如果您至少可以指出正确的方向,我将不胜感激!

从Javadoc

如果此任务的任何执行*花费的时间超过其周期,则后续执行*可能会延迟启动,但不会同时执行。

因此,您只需要等待过程在您的可运行程序中完成,如下所示:

Process p =  Runtime.getRuntime().exec(...);
p.waitFor();

在这种情况下,您的Runnable将等待基础进程完成,并且由于ScheduledThreadPool工作方式,因此不会有重叠的进程执行。

  相关解决方案