知优码

您现在的位置是:首页 > 开源项目 > 项目经验

项目经验

java如何实现单实例应用程序

2021-01-13项目经验
java如何实现单实例应用程序

一、概述

有时,我看到许多应用程序(例如msn,Windows Media Player等)都是单实例应用程序(当用户在应用程序运行时执行时,将不会创建新的应用程序实例)。

在C#中,我Mutex为此使用类,但是我不知道如何在Java中执行此操作。

二、详解

如果我相信这篇文章,可以通过:

让第一个实例尝试在localhost接口上打开侦听套接字。如果能够打开套接字,则假定这是要启动的应用程序的第一个实例。如果不是,则假定该应用程序的实例已在运行。新实例必须通知现有实例尝试启动,然后退出。现有实例在收到通知后将接管工作,并向处理该操作的侦听器触发一个事件。

注意:Ahe在评论中提到使用InetAddress.getLocalHost()可能很棘手:

  • 它不能在DHCP环境中按预期方式工作,因为返回的地址取决于计算机是否可以访问网络。
    解决的办法是打开与InetAddress.getByAddress(new byte[] {127, 0, 0, 1});
    可能与错误4435662有关。
  • 我还发现了错误4665037,它报告的预期结果为getLocalHost:返回机器的IP地址,而不是实际结果:return 127.0.0.1

令人惊讶的是,在Linux上获得getLocalHost回报127.0.0.1,但在Windows上却没有。


或者您可以使用ManagementFactory对象。正如解释在这里:

getMonitoredVMs(int processPid)方法接收当前应用程序PID作为参数,并捕获从命令行调用的应用程序名称,例如,该应用程序是从c:\java\app\test.jar路径启动的,则值变量为“ c:\\java\\app\\test.jar”。这样,我们将在下面的代码的第17行中仅捕获应用程序名称。
之后,我们在JVM中搜索具有相同名称的另一个进程,如果发现它并且应用程序PID不同,则意味着这是第二个应用程序实例。

JNLP还提供了 SingleInstanceListener