从同一Java应用程序的两个实例依次执行

从同一Java应用程序的两个实例依次执行,java,Java,我有一个名为“X”的Java应用程序。在Windows环境中,在给定的时间点上可能有多个应用程序实例。 我希望在应用程序“X”中顺序执行一段公共代码,而不管应用程序有多少个实例正在运行。这是可能的,也是可以实现的吗?任何建议都会有帮助 示例:-我有一个名为Executor的类,其中将调用方法execute()。假设在任何给定的时间点可能有两个或多个应用程序实例,如何让方法execute()从不同的实例顺序运行? 是否有类似于锁的东西可以从两个实例访问,并查看锁当前是否处于活动状态?有什么帮助吗?

我有一个名为“X”的Java应用程序。在Windows环境中,在给定的时间点上可能有多个应用程序实例。 我希望在应用程序“X”中顺序执行一段公共代码,而不管应用程序有多少个实例正在运行。这是可能的,也是可以实现的吗?任何建议都会有帮助

示例:-我有一个名为
Executor
的类,其中将调用方法
execute()
。假设在任何给定的时间点可能有两个或多个应用程序实例,如何让方法
execute()
从不同的实例顺序运行?
是否有类似于锁的东西可以从两个实例访问,并查看锁当前是否处于活动状态?有什么帮助吗?

据我所知,你做这件事不那么容易。您可以在进程之间实现TCP调用。。。但我不建议这样做

您最好创建一个负责执行任务的外部进程,并通过向执行者进程将使用的队列发送消息来请求所有要执行的任务


…或者,您可能不需要在同一时间运行多个进程,但您可能需要的只是一个应用程序,该应用程序将有多个线程在同一时间执行任务,并且有一个线程专用于执行器
。这样,同步
execute()
方法(或整个
executer
)就足够了,可以为您节省一些时间。

我认为您正在寻找的是一个分布式锁(即从许多进程可见和可控的锁)。有相当多的第三方库已经考虑到这一点而开发,其中一些将在本页中讨论

本文还提出了一些其他建议,使用底层系统上的文件作为同步机制


使用执行器或类似的东西无法实现这一点,因为Java虚拟机将是独立的

如果您真的需要在多个独立实例之间进行同步,其中一种方法是在应用程序中专用内部端口并实现一个简单的内部服务器。如果您需要广泛的沟通,请研究或提供全面的解决方案。第一个实例绑定到专用应用程序端口并成为主节点。所有后续实例都会找到应用程序端口,但随后可以使用它对主节点进行HTTP(或仅TCP/IP)调用,以报告它们需要执行的活动

由于您只需要按顺序执行某些操作,所以任何从属节点都可能要求主节点执行此操作,而不是自行执行


这种方法的一个潜在问题是,如果用户关闭主节点,那么实现另一个正在运行的节点如何替代它的方法可能会很复杂。如果在任何时候只有一个节点处于活动状态(接收用户的输入),则在发现主节点没有响应并且端口没有被占用后,它可能会充当主节点的角色。

分布式队列可用于这种负载平衡。您将一个或多个“请求消息”放入一个队列中,下一个可用的使用者应用程序将其拾取并处理。每个这样的请求消息都可以描述您要处理的任务

这种类型的队列可以实现为JMS队列(例如,使用ActiveMQ),或者在Windows上还有MSMQ:。
如果性能是一个问题,并且您可以使用C/C++开发者,那么“共享内存队列”也可能很有趣:shmemq API

您必须使用“execute()”方法运行一个中央独立应用程序,并使用TCP或任何协议从其他应用程序调用它。这个“ExcUTER()”应该是同步的,可能尝试类似于C++中的一个中央COM服务器,JNI设置器用于标志指示状态为活动。让java应用程序检查COM服务器的标志,如果它处于活动状态,让它等待(一些预定义的时间,然后再次重试),否则将状态设置为COM为活动状态,并继续执行()仅考虑,如果两个实例说X1和X2试图在同一时间点设置标志?如何避免冲突?