Path: csiph.com!2.eu.feeder.erje.net!feeder.erje.net!1.eu.feeder.erje.net!weretis.net!feeder4.news.weretis.net!news.trigofacile.com!.POSTED.reverse-90.fdn.fr!not-for-mail From: Yliur Newsgroups: fr.comp.lang.java Subject: Re: Terminer un Thread. Date: Thu, 13 Sep 2018 07:31:48 +0200 Organization: Groupes francophones par TrigoFACILE Message-ID: <20180913073148.135d0f4f@free.fr> References: <5b9992bb$0$5486$426a74cc@news.free.fr> <20180913012022.478eee8b@free.fr> <5b99d812$0$20328$426a74cc@news.free.fr> Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Injection-Info: news.trigofacile.com; posting-account="yliur@free.fr"; posting-host="reverse-90.fdn.fr:80.67.176.90"; logging-data="27908"; mail-complaints-to="abuse@trigofacile.com" X-Newsreader: Claws Mail 3.17.1 (GTK+ 2.24.32; x86_64-pc-linux-gnu) Xref: csiph.com fr.comp.lang.java:1707 Le 13 Sep 2018 03:22:58 GMT jp a écrit : > Le Thu, 13 Sep 2018 01:20:22 +0200, Yliur a écrit : > > > Le Thu, 13 Sep 2018 00:41:19 +0200 Samuel DEVULDER > > a écrit : > > >> La façon, propre de faire cela est d'utiliser un drapeau > >> (booleen). Tu remplace le while(true) par while(drapeau), et pour > >> stopper tu passes le drapeau à faux et envoie une interruption > >> (interrupt()) au thread pour le sortir d'un eventuel object.wait() > >> ou autre appel d'entrée/sortie sur lequel il serait coincé. > > > > La modification et la lecture de la valeur devraient également se > > trouver dans des blocs synchronisés (par exemple des fonctions > > marquées synchronized), pour être sûr que la valeur a bien été > > partagée entre les fils d'exécution. > > Ok,merci! Si j'envoie une interruption interrupt() cela va stopper ma > boucle immédiatement? Parceque le bloc while(true){code} peut être > très long dans mon cas... Plusieurs minutes ou dizaines de minutes. > Je voudrais le terminer tout de suite et ne pas attendre que la > valeur while (condition) soit traitée. > > Dans un bouquin on me conseille de faire: > try { > while(true){ > if (interrupted()) return; > } > } catch (InterruptedExeption e){return;} > > Je vais tester pour voir. Merci de vos réponses. Les questions importantes à te poser pour choisir comment faire : - Est-ce que tu veux couper ton fil d'exécution en pleine action, vraiment n'importe quand ? - Est-ce qu'il ne risque pas de laisser des données (visibles en dehors du fil) dans un état incohérent ? - Est-ce que le fil exécute une boucle dans laquelle il passe très souvent et obligatoirement à un endroit donné du code ? - Est-ce que le fil est parfois bloqué (appel à sleep pour un long moment, attente d'une connexion réseau, ...) ?