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

时间:2019-02-25 01:37:00

标签: java process exec runnable scheduledexecutorservice

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

基本上这是我的代码:

busList

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

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

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

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);

,但是看来您只能将最终变量带入可运行变量,所以这是不可能的。 当然,我尽力研究了所有相关信息,但是如果您至少可以指出正确的方向,我将不胜感激!

1 个答案:

答案 0 :(得分:2)

来自Javadoc

  

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

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

public class Content extends Object{
    private String key;
    private String value;   
    private String keyVal;

    public Content (String key, String value) {

        this.key = key;
        this.value = value;
    }

    public String getKey() {

        return key; 
    }

    public String getValue() {

        return value;   
    }

    public String getKeyValue(){
        return key+value;
    }

    public void display(){      
        System.out.println(this.key+","+this.value);
    }

}

在这种情况下,您的Process p = Runtime.getRuntime().exec(...); p.waitFor(); 将等待基础过程完成,并且由于Runnable的工作方式,您的过程不会重叠执行。

相关问题