java - 避免调度执行器创建 java 进程的多个实例

标签 java process exec runnable scheduledexecutorservice

我创建了一个 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

这是一次只能运行一个实例的实例。 每次运行此可运行对象时,它都会调用 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

If any execution of this task * takes longer than its period, then subsequent executions * may start late, but will not concurrently execute.

所以你只需要等待进程在你的可运行程序中完成,如下所示:

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

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

关于java - 避免调度执行器创建 java 进程的多个实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54858393/

相关文章:

node.js - 将 Node.js 项目转换为可执行文件

linux - 如何从父目录查找和复制子目录中的文件 linux

memory-management - 从内核模块更改用户空间内存保护标志

java - JRE、Java 7u65 更新后,Web 启动应用程序抛出 JNLPException

java - 禁用 XMLInputFactory 中的功能安全处理

java - SPRING - @Autowired 和 @Service 不起作用

python - 动态命名进程

c++ - 终止进程以 ShellExecuteEx 启动

c - multi-pipe() C 程序中的无限循环

java - 在单个事务中将 50000 条记录存储在 mysql 中的最佳做法是什么