91 votes

Comment implémenter une application Java à instance unique?

Parfois, je vois de nombreuses applications telles que msn, Windows Media Player, etc. qui sont des applications à instance unique (lorsque l'utilisateur s'exécute alors que l'application est en cours d'exécution, une nouvelle instance d'application ne sera pas créée).

En C #, j'utilise Mutex class pour cela, mais je ne sais pas comment faire cela en Java.

70voto

Robert Points 236

J’utilise la méthode suivante dans la méthode main. C’est le plus simple, plus robuste et moins intrusive méthode, j’ai vu alors j’ai pensé que je partagerais.

62voto

VonC Points 414372

Si j'en crois cet article, par :

la première instance de tenter d'ouvrir une socket en écoute sur l'interface localhost. Si elle est en mesure d'ouvrir le socket, il est supposé que c'est la première instance de l'application à lancer. Si non, l'hypothèse est qu'une instance de cette application est déjà en cours d'exécution. La nouvelle instance doivent en informer l'instance existante d'un lancement a été tentée, puis sur quitter. L'instance existante prend le relais après la réception de la notification et déclenche un événement à l'auditeur qui gère l'action.

Remarque: Répétez les mentionne dans le commentaire que l'utilisation d' InetAddress.getLocalHost() peut être délicat:

  • il ne fonctionne pas comme prévu dans le DHCP-environnement parce que l'adresse retournée dépend de si l'ordinateur a accès au réseau.
    La Solution a été d'ouvrir la connexion avec InetAddress.getByAddress(new byte[] {127, 0, 0, 1});
    Probablement lié à un bug 4435662.
  • J'ai aussi trouvé un bug 4665037 qui les rapports que les résultats Attendus de l' getLocalHost: le retour de l'adresse IP de la machine, par rapport aux résultats : rendement 127.0.0.1.

il est surprenant d'avoir getLocalHost rendement 127.0.0.1 sur Linux mais pas sous windows.


Ou vous pouvez utiliser ManagementFactory objet. Comme expliqué ici:

Le getMonitoredVMs(int processPid) méthode reçoit en paramètre l'application en cours PID, et attraper le nom de l'application qui est appelé en ligne de commande, par exemple, l'application a été commencé à partir de c:\java\app\test.jar chemin d'accès, puis la valeur de la variable est "c:\java\app\teste.jar". De cette façon, nous allons prendre juste le nom de l'application sur la ligne 17 du code ci-dessous. Après cela, nous sommes la recherche de JVM pour antoher processus avec le même nom, si nous l'avons trouvé et l'application PID est différent, cela signifie que c'est la deuxième instance de l'application.

JNLP propose également un SingleInstanceListener

11voto

Andrew Thompson Points 108505

Si l’application a une interface graphique, lancez-le avec les témoins de Jéhovah et l’utilisation du `` . Voir la démo. de la SingleInstanceService pour (démo. et) exemple de code.

6voto

parvez Ahmad Points 61

Oui, c’est une réponse vraiment décente pour eclipse application à instance unique eclipse RCP ci-dessous est mon code

dans application.java

6voto

rumatoest Points 101

J’ai créer la classe Java pour résoudre ce problème. Vous pouvez le trouver source ici http://nerdydevel.blogspot.com/2012/07/run-only-single-java-application-instance.html

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X