Empêcher de relancer la même app[Java]

[Fermé]
Signaler
-
 Lucie -
Coucou,

je cherche un moyen d'empecher le relancement de la même appli java tant que cette derniere est encore en cours d'execution !

Est-ce tout simplement possible... ?

Merci,
Lucie



2 réponses

Messages postés
16400
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
21 septembre 2021
2 879
Non c'est possible, mais il faut tricher un peu (en particulier pour rester multiplate-forme).
Voici une solution simple mais pas forcément très élégante :

Au démarrage du premier programme, tu créés un fichier avec un nom connu d'avance par exemple dans le répertoire des fichiers temporaires (le fichier peut être vide)
Au lancement d'un deuxième programme, tu regarde si le fichier existe, et puisque c'est le cas tu lui interdit de s'exécuter d'avantage et tu fermes le deuxième programme.
À l'arrêt du premier programme, tu supprimes le fichier pour une utilisation ultérieure.

Avantage : c'est assez simple à mettre en place et en général ça fonctionne.
Inconvénient : si ton programme plante et que le fichier n'est pas supprimé, aucun autre programme ne pourra plus être créé.

Amélioration : on pourrait créer un thread qui dort la plupart du temps et qui se réveille par exemple une fois par minute pour écrire dans ce fichier l'heure qu'il est.
Le deuxième programme regarde si le fichier existe et vérifie l'heure qui est indiquée, si l'heure est plus ancienne que deux minutes, alors le premier programme s'est interrompu sans avoir supprimé le fichier. Dans ce cas on autorise l'application a se lancer.

Avantage : ça reste simple à mettre en place et ça résout le problème de tout à l'heure.
Inconvénient : si le programme plante, il faut attendre deux minutes pour le relancer.

Une alternative plus propre, mais plus compliqué à mettre en place, c'est d'utiliser jps, le gros inconvénient, c'est qu'il n'est installé qu'avec la JDK. Donc chez un utilisateur lambda qui n'a que la JRE, on ne pourra pas lister les processus de la JVM. Mais il existe peut-être des équivalents de jps qui tournent sur la JRE, il faudrait approfondir.
Salut !

Ta solution est ingénieuse et est,effectivement très facile à mettre en place.


Je pense avoir néanmoins trouvé une solution supplémentaire

J'ai stocké la liste des process windows dans une liste

(j'ai utilisé ce site pour comprendre :

http://www.rgagnon.com/javadetails/java-0593.html

)

ensuite je pourrais faire un bête test si result.contains ("Le process que tu veux);


Mais Effectivement ce n'est pas multiplateforme ( mais à la base mon application ne fonctionnait déjà que sur windows :p
Messages postés
16400
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
21 septembre 2021
2 879
Je ne suis pas sûr que la liste des processus du système distingue chaque application Java.
Je pense qu'il va lister la JVM mais c'est tout, sans savoir ce qui tourne à l'intérieur.
Il n'y a qu'en testant que tu le sauras, mais cela reprend le principe de jps.

Remarque : faire du Java et ne pas le faire multiplate-forme c'est mal ^^
Cela fonctionne ! encore quelques petits bugs à regler mais ca devrait aller ;)

Je développe un petit projet perso qui utilise des commandes windows en fait, du coup il n'est pas portable, mais je pourrais le rendre générique !

Dans une prochaine MAJ peut être ;p

Merci