当前位置: 首页 > 面试题库 >

仅在尚未运行时启动Java程序

晁璞
2023-03-14
问题内容

我需要在Java应用程序中启动1-3个外部程序,这些程序具有用户定义的路径。我有几个要求:

  1. 如果程序已经在运行,我不希望其执行

  2. 我不希望任何程序从我的Java应用程序中夺走焦点

  3. 我不在乎其中任何一个是否无法启动。他们只需要默默地失败。

到目前为止,这是我想出的:

ProcessBuilder pb = new ProcessBuilder(userDefinedPath1);
try {
    pb.start();
}
catch (Exception e) {
    // Something went wrong, just ignore
}

然后我再用其他两条路径重复3次。就像我期望的那样开始,并满足了我的第三个要求,但是在前两个条件上却失败了。

做这个的最好方式是什么?

编辑:

  1. 我对这些其他应用没有任何控制权。他们是第三方。同样,它们可能已由用户随时手动启动或停止。

  2. 我知道可执行文件的 确切 名称(例如“ blah.exe”),它们将 始终 相同,但是可执行文件的路径不一定相同。

  3. 批处理文件包装器在这里不可行。

  4. 其他应用 不是 Java应用,只是普通的Windows可执行文件。


问题答案:

我猜您对其他两个应用程序没有控制权…如果您做到了,那还不算太糟-您可以让他们听一个套接字,看看来时套接字是否可用向上。

下一个解决方案实际上可能与语言无关。您可以通过批处理文件包装程序管理整个系统。编写一个批处理文件,该文件在启动时会创建一个文件,在停止时会删除它。Unix系统大量使用此技术-
他们经常将文件称为锁定文件。

如果只有您的应用程序会启动这些其他应用程序,那么您可以简单地跟踪是否已启动它,所以我猜测这是不可能的,或者您不会问,所以我假设用户可能通过其他机制启动了这些程序。

如果您无法控制其他应用程序的启动,甚至无法编写批处理文件来启动它们,那么您就无法做您想做的事情(请注意,这些应用程序必须始终使用该批处理文件,即使用户手动启动它们也是如此。

我要做的最后一项工作可能是获取进程状态并对其进行解析,但是您必须确切地知道PS中其他应用程序的调用方式,这并不是一件容易的事。同样,所有的Java应用程序在大多数进程状态打印输出中倾向于具有相同的准确签名,这可能使它无用。

问题是,如果这些程序之一是在应用程序外部启动的,则除非您碰巧知道它是确切的过程状态签名,而且甚至是不稳定的,否则您几乎无法识别该事实。



 类似资料:
  • 问题内容: 因此,我试图将cron作业设置为我创建的守护程序的一种看门狗。如果守护程序出错并失败,我希望cron作业定期重新启动它…我不确定这样做的可能性如何,但是我通读了一些cron教程,找不到任何可以做我的事情正在寻找… 我的守护程序是从Shell脚本开始的,所以我真的只是在寻找一种方法来运行cron作业,前提是该作业的先前运行仍未运行。 它确实为我试图使用锁定文件提供了解决方案,但我不确定是

  • 苏,希望你们都没事。出于某种原因,在我的java代码中,当我按下一个键(当它工作时),我的ActionListener要求我保持计时器启动,否则会绘制一个矩形并显示JLabel simple的条件不会运行,因为ActionListener无法调用它。 这是工作代码。 下面是使actionEvent不执行的原因

  • 问题内容: 我有一个包含Java应用程序的JAR文件。如何使它从Windows开始而不需要用户交互? 问题答案: 创建一个.bat文件,并将其放入其中: 然后将.bat文件放入Windows启动文件夹。 还有一件事:使用java和javaw之间是有区别的。虽然在调试应用程序时使用Java更好,但应用程序会打印文本或类似内容,而在不需要时,javaw则更好。为什么?因为java使用控制台显示所有应用

  • 我有一个包含Java应用程序的JAR文件。如何在不需要用户交互的情况下从Windows开始?

  • 问题内容: 我已经尝试按照以下教程和文档进行有关如何对Web服务器进行docker化的操作,但是我无法通过docker run命令使该服务运行。 这是我的Dockerfile: 我创建我的图像: 当我运行它时: 它似乎只是停止: 我希望它与端口81-> 80一起运行,但事实并非如此。跑步 似乎什么也没做。 我也尝试过直接输入 从这里我可以开始服务 从另一个标签中,我可以看到它正在按预期方式工作(也

  • 问题内容: 我一直使用类似于以下内容的方法来实现它: …但是一旦加载,就会发生主键冲突。这是唯一插入到该表中的唯一语句。那么这是否意味着上述陈述不是原子的? 问题在于,这几乎不可能随意重建。 也许我可以将其更改为以下内容: 虽然,也许我使用了错误的锁,或者使用了过多的锁之类的东西。 看到了其他问题,那里的答案都提示“ IF(SELECT COUNT(*)…INSERT”等),但我始终处于(也许不正