arreter un programme java qui boucle [java] [linux] - Java - Programmation
Marsh Posté le 24-11-2005 à 11:06:39
Quand il n'y a plus d'instruction à exécuter, la machine virtuelle s'arrête.
Marsh Posté le 24-11-2005 à 11:15:18
Oui mais moi, j'ai besoin que ça tourne tout le temps. --> donc une boucle while(true)
Mais desfois j'ai besoin de l'arreter et de le redémarrer....
Marsh Posté le 24-11-2005 à 11:31:22
Bonjour,
et pourquoi ne pas faire un kill -3 ou kill -15
Oliv'
Marsh Posté le 24-11-2005 à 13:13:55
fcoisb a écrit : Oui mais moi, j'ai besoin que ça tourne tout le temps. --> donc une boucle while(true) |
Tu prévois une condition d'arrêt de ta boucle, alors ?
Marsh Posté le 24-11-2005 à 14:14:54
ReplyMarsh Posté le 24-11-2005 à 14:16:28
faut pas que a tourne tout le temps si tu souhaites l'arreter de temps en temps....
Marsh Posté le 24-11-2005 à 14:17:50
Eteins le pc
Marsh Posté le 24-11-2005 à 14:17:51
Il veut dire une condition d'arrêt externe je pense, du genre "tant que ce fichier existe", ensuite en bash il te suffit de créer le fichier, lancer ton prog, et dès que tu supprime le fichier, ton machin en java s'arrète.
(ok c'est mauche, lent, mais c'est pour expliquer l'idée)
Marsh Posté le 24-11-2005 à 14:23:41
uriel a écrit : |
C'est soit l'un, soit l'autre. Et quand tu dis "tourne tout le temps", en fait, tu veux dire "tourne tout le temps jusqu'à ce que je lui dise, je ne sais pas encore comment, d'arrêter de tourner." Et ça, c'est une condition d'arrêt.
Marsh Posté le 25-11-2005 à 05:11:19
Tu peux le killer et arrêter ton prog proprement en installant un hook:
Runtime.getRuntime().addShutdownHook. C'est appelé quand la jvm se ferme (donc quand tu la kill aussi .
Marsh Posté le 25-11-2005 à 16:36:07
ca depends comment tu la killes...
Citation : In rare circumstances the virtual machine may abort, that is, stop running without shutting down cleanly. This occurs when the virtual machine is terminated externally, for example with the SIGKILL signal on Unix or the TerminateProcess call on Microsoft Windows. |
http://java.sun.com/j2se/1.4.2/doc [...] ng.Thread)
Marsh Posté le 25-11-2005 à 16:40:08
g012 a écrit : Tu peux le killer et arrêter ton prog proprement en installant un hook: |
kill ne sert pas à tuer une application, mais à lui envoyer un signal
Marsh Posté le 26-11-2005 à 01:22:32
salut je suis pas programeur mais j'ai une idée peut etre qui vaut rien du tout mais bon je vous l'expose au cas ou ca vous inspirerez.
Pk pas créer deux threads ds le programe dont un avec la boucle et l'autre avec une condition pour arreter la boucle ds les grande lignes:
int p = 0;
thread1{boucle +une condition if(p==0){la boucle s'arrete pas}
else{boucle s'arrete (break}}
tread2{si je clique sur le bouton p vaut 1;}
Marsh Posté le 26-11-2005 à 11:43:11
le truc c'est qu'il veut arrêter son prog java en dehors du process java si j'ai bien compris => il faut se décider sur un évenement qui sera "captable" depuis le prog java et générable depus l'extérieur du fichier.
en unix, ce serait un signal (kill machin). Ca peut aussi être une trame tcp, ou un test sur l'existence d'un fichier ...
Marsh Posté le 26-11-2005 à 13:58:53
benou a écrit : le truc c'est qu'il veut arrêter son prog java en dehors du process java si j'ai bien compris => il faut se décider sur un évenement qui sera "captable" depuis le prog java et générable depus l'extérieur du fichier. |
benou > Pour la trame TCP ou le test d'existence fichier, ça marche, mais ce qui m'agace, c'est que rien ne te dit que tu pourras arrêter la boucle principale directement, ou même l'arrêter tout court :
- Si la boucle principale "pseudo-infinie" fait son job, puis un sleep, ça veut dire que tu devras adapter le sleep à la granularité de réaction souhaitée. P.e. 1s pour qu'au pire, on attende 1s si la condition d'arrêt est détectée. Ce qui oblige à calquer la longueur du sleep sur la granularité du signal d'arrêt.
- Si la boucle principale comporte un appel bloquant, c'est super emmerdant. Si c'est un appel bloquant sur socket, tu peux imaginer d'envoyer le signal convenu sur ce socket, mais c'est par toujours évident ou souhaitable.
Bien entendu, un thread java qui boucle et qui doit pouvoir être arrêté est supposé vérifier périodiquement si une condition d'arrêt est remplie, as per javadoc, puisqu'un "stop" n'est pas permis. Bonne chance s'il est bloqué ou si sa granularité de le lui permet pas.
Le problème est que contrairement au signal (kill), on obtient un modèle pull, où le thread principal doit soit faire le boulot de voir la condition d'arrêt est remplie, soit au moins être de bonne composition et réagir promptement si on le notifie.
Reste encore la possibilité de jouer avec les threads deamon, mais ça ne fait peut-être que déplacer le problème.
Ou le shutdown hook.
Des fois, Java...
Marsh Posté le 26-11-2005 à 18:55:07
sircam a écrit : benou > Pour la trame TCP ou le test d'existence fichier, ça marche, mais ce qui m'agace, c'est que rien ne te dit que tu pourras arrêter la boucle principale directement, ou même l'arrêter tout court : |
Bha non ... ton thread qui écoute la socket fait un leThreadDeLaBouclePrincipale.interupt() et zou !
sircam a écrit : |
Ouais. là ça craint.
Je me suis toujours demandé pkoi un read sur un InputStream pouvait pas balancer un InterruptedException (qui serait runtime soit dit en passant).
avec java.nio y a moyen de faire des lectures non bloquantes ...
sircam a écrit : |
C'est la seule façon de faire si tu veux que ton programme se ferme proprement... c'est pas pour rien que le stop a été rendu deprecated dans les threads.
sircam a écrit : |
je vois pas ce que ça change ... ni les threads daemon, ni le shutdownhook ...
sircam a écrit : Des fois, Java... |
Marsh Posté le 24-11-2005 à 10:52:53
Bonjour,
j'ai un script sh (lancé en arrière plan) qui permet de lancer un programme java qui lui tourne en boucle.
Comment puis je arreter proprement le programme java à la fin de la boucle (demande d'arret à n'importe quel moment). Et non de réaliser un kill....
Merci d'avance!