避免计划执行程序创建Java进程的多个实例

问题描述 投票:0回答:1

我创建了一个scheduledTask,它执行对外部.jar的调用,创建一些xml文件,我希望每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");


        }
}

但似乎你只能将最终变量带入runnable,所以这是不可能的。当然,我试着尽我所能研究这个问题,但如果你至少能指出我在哪里看正确的方向,我真的很感激!

java process exec runnable scheduledexecutorservice
1个回答
2
投票

来自Javadoc

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

所以你只需要等待进程在你的runnable中完成这样的事情:

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

在这种情况下,你的Runnable将等待基础过程完成,因为ScheduledThreadPool如何工作,你的过程将不会重叠执行。

© www.soinside.com 2019 - 2024. All rights reserved.