Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Destruction d'un thread

9 réponses
Avatar
Chat
Bonjour,
j'aimerais savoir comment detriure un thread:
quand je met myThread.destroy() cela me genere un NoSuchMethodError.
Sinon mon code est un peu crados, cad qu'au lieu de reutiliser un thread
je dois en creer un autre chaque fois que j'en ai besoin.
SI je met myThread=null quand j'ai fini de m'en servir est qu'il y a
moyen de forcer la JVM a desallouer la ref???
merci

9 réponses

Avatar
Bernard Koninckx
Bonjour,

Je suis pas psécialiste des threads mais je me demande si il n'y a pas une
méthode stop ou quelque chose dans le genre qui s'applique aux threads.

Des spécialistes pourront certainement mieux te répndre qu'un simple
débutant comme moi.

Bernard


"Chat" a écrit dans le message de news:
40448129$0$28153$
Bonjour,
j'aimerais savoir comment detriure un thread:
quand je met myThread.destroy() cela me genere un NoSuchMethodError.
Sinon mon code est un peu crados, cad qu'au lieu de reutiliser un thread
je dois en creer un autre chaque fois que j'en ai besoin.
SI je met myThread=null quand j'ai fini de m'en servir est qu'il y a
moyen de forcer la JVM a desallouer la ref???
merci


Avatar
Kupee
Chat wrote:
Bonjour,
j'aimerais savoir comment detriure un thread:
quand je met myThread.destroy() cela me genere un NoSuchMethodError.
Sinon mon code est un peu crados, cad qu'au lieu de reutiliser un thread
je dois en creer un autre chaque fois que j'en ai besoin.
SI je met myThread=null quand j'ai fini de m'en servir est qu'il y a
moyen de forcer la JVM a desallouer la ref???


Le mieux est qu'il finisse l'exécution de sa méthode run() donc si tu as
une boucle dedans tu peux faire un truc genre

public void run() {
while (running) {
...
}
}
et quand tu veux stopper tu met running a false.

Sinon tu as le interrupt() mais il vaut mieux l'éviter autant que
possible je crois

Avatar
Chat
oui c ce que je fais pour le stopper, mais ensuite je veux effacer la
ref de ce thread en memoire, car malheuresement je dois en creer
plusieurs alors veux liberer la memoire des que j'ai + besoin de
qq'chose, sinon est ce que vous savez comment invoker le garbage
collector???

Chat wrote:

Bonjour,
j'aimerais savoir comment detriure un thread:
quand je met myThread.destroy() cela me genere un NoSuchMethodError.
Sinon mon code est un peu crados, cad qu'au lieu de reutiliser un
thread je dois en creer un autre chaque fois que j'en ai besoin.
SI je met myThread=null quand j'ai fini de m'en servir est qu'il y a
moyen de forcer la JVM a desallouer la ref???



Le mieux est qu'il finisse l'exécution de sa méthode run() donc si tu as
une boucle dedans tu peux faire un truc genre

public void run() {
while (running) {
...
}
}
et quand tu veux stopper tu met running a false.

Sinon tu as le interrupt() mais il vaut mieux l'éviter autant que
possible je crois



Avatar
Arnaud Roger
"Chat" a écrit dans le message de
news:4044863f$0$28123$
oui c ce que je fais pour le stopper, mais ensuite je veux effacer la
ref de ce thread en memoire, car malheuresement je dois en creer
plusieurs alors veux liberer la memoire des que j'ai + besoin de
qq'chose, sinon est ce que vous savez comment invoker le garbage
collector???
c'est une mauvaise idee de vouloir forcer le garbage collector a faire son

travail.

http://www-106.ibm.com/developerworks/java/library/j-jtp01274.html

il faut peut etre plutot regarder du coté du pool de thread, la creation
d'un Thread est en effet
quelque chose de couteux.

Arnaud R.

Avatar
Kupee
Chat wrote:
oui c ce que je fais pour le stopper, mais ensuite je veux effacer la
ref de ce thread en memoire, car malheuresement je dois en creer
plusieurs alors veux liberer la memoire des que j'ai + besoin de
qq'chose, sinon est ce que vous savez comment invoker le garbage
collector???


Ah, ba une fois que tu n'as plus de référence vers ce Thread et s'il ne
tourne plus, le Garbage Collector devrait le libérer.
Si tu veux l'invoquer, System.gc()
Mais les specs de la JVM ne garantissent pas le fonctionnement de cette
méthode (en pratique ca marche, mais peut etre qu'on peut trouver des
jvms qui n'y répondent pas)
De plus invoquer le garbage collector est relativement lent, et donc il
faut vraiment en avoir grand besoin

Avatar
Bruno Causse
dans l'article 404490a1$0$28131$, Kupee à
a écrit le 02/03/2004 14:48 :

Si tu veux l'invoquer, System.gc()
Mais les specs de la JVM ne garantissent pas le fonctionnement de cette
méthode (en pratique ca marche, mais peut etre qu'on peut trouver des
jvms qui n'y répondent pas)
De plus invoquer le garbage collector est relativement lent, et donc il
faut vraiment en avoir grand besoin


sans interet, le seul cas que je j'entrevois est dans une attente d'action.
tant qu'a attendre je ramasse les miettes :)

Avatar
SK
Kupee wrote:
Le mieux est qu'il finisse l'exécution de sa méthode run() donc si tu as
une boucle dedans tu peux faire un truc genre

public void run() {
while (running) {
...
}
}
et quand tu veux stopper tu met running a false.

Sinon tu as le interrupt() mais il vaut mieux l'éviter autant que
possible je crois


En effet, mais contrairement à ce que tu dis, la méthode interrupt()
sert à ça !

while(!isInterrupted()){
...
}

L'appel à la méthode interrupt() n'arrête pas du tout la thread, elle
change juste un drapeau que récupère la méthode isInterrupted(), ce qui
peut permettre de mettre fin à la thread en lui faisant quitter la
méthode run.
En ajoutant un booleen running, tu réinventes un peu la roue.

Par contre la méthode destroy() est deprecated parce que forcer un
thread à quitter brutalement peut entraîner des incohérences dans les
données qu'elle était en train de manipuler.

Désolé d'être un peu sorti du contexte, mais je me devais d'apporter
quelques précisions.

SK.

Avatar
Kupee
SK wrote:
En effet, mais contrairement à ce que tu dis, la méthode interrupt()
sert à ça !

while(!isInterrupted()){
...
}

L'appel à la méthode interrupt() n'arrête pas du tout la thread, elle
change juste un drapeau que récupère la méthode isInterrupted(), ce qui
peut permettre de mettre fin à la thread en lui faisant quitter la
méthode run.
En ajoutant un booleen running, tu réinventes un peu la roue.

Par contre la méthode destroy() est deprecated parce que forcer un
thread à quitter brutalement peut entraîner des incohérences dans les
données qu'elle était en train de manipuler.

Désolé d'être un peu sorti du contexte, mais je me devais d'apporter
quelques précisions.


Tout a fait je m'étais trompé. Par contre dans ce cas je saisis pas bien
pourquoi elle est native cette méthode.
Est ce que ca réveille un thread qui était en sleep ou en wait ?

Avatar
SK
Kupee wrote:
Tout a fait je m'étais trompé. Par contre dans ce cas je saisis pas bien
pourquoi elle est native cette méthode.
Est ce que ca réveille un thread qui était en sleep ou en wait ?


Comme je l'avais dit, la méthode interrupt ne fait que modifier un champ
que peut consulter la méthode isInterrupted(). Donc elle ne réveille en
aucune manière une thread qui est en sleep ou en wait.
Il faut donc continuer à passer par les méthodes notify() ou notifyAll()
comme d'habitude pour les réveiller.

SK.