Comment tuer tous les threads d'une liste
Fermé
GregNoob
-
31 janv. 2014 à 16:38
KX Messages postés 16753 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 - 1 févr. 2014 à 00:01
KX Messages postés 16753 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 - 1 févr. 2014 à 00:01
A voir également:
- Comment tuer tous les threads d'une liste
- Liste déroulante excel - Guide
- Liste déroulante en cascade - Guide
- Comment masquer sa liste d'amis sur facebook mobile - Guide
- Liste site streaming illégal - Accueil - Services en ligne
- Liste de diffusion whatsapp - Guide
1 réponse
KX
Messages postés
16753
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
25 novembre 2024
3 019
31 janv. 2014 à 20:53
31 janv. 2014 à 20:53
Il faudrait synchroniser ta méthode killThreadList sur ta liste pour qu'un seul de ces thread puisse rentrer dedans à la fois.
Remarque : la méthode stop() est dépréciée car dans certain cas elle plante, il faut en remplacement utiliser la méthode interrupt() et gérer dans tes thread l'état isInterrupted().
Exemple :
Remarque : la méthode stop() est dépréciée car dans certain cas elle plante, il faut en remplacement utiliser la méthode interrupt() et gérer dans tes thread l'état isInterrupted().
Exemple :
import java.io.IOException; import java.util.ArrayList; import java.util.List; import java.util.Random; import java.util.concurrent.atomic.AtomicInteger; public class Test { public static class ExtractionThread extends Thread { private static final Random rand = new Random(); private static final AtomicInteger ids = new AtomicInteger(0); private final int id = ids.incrementAndGet(); private final List<Thread> group; public ExtractionThread(List<Thread> group) { this.group = group; } @Override public void run() { int nb = rand.nextInt(100); System.out.println(this+" start for "+nb+" loop"); for (int i=0; i<nb; i++) { if (isInterrupted()) { System.out.println(this+" is interrupted"); return; } System.out.println(this+" at step "+i+"/"+nb); } System.out.println(this+" ends at "+nb); interruptAllGroupThread(); } public void interruptAllGroupThread() { synchronized(group) { setPriority(MAX_PRIORITY); System.out.println(this + " interrupt all : "+group); // Send interrupt call for (Thread t : group) { if (t==this) continue; System.out.println("Thread " + id + " interrupt : "+t); t.interrupt(); } // Wait all thread ends for (Thread t : group) { if (t==this) continue; try { t.join(); } catch (InterruptedException e) { System.err.println("Can't wait "+t); } } System.out.println(this+" have interrupt all"); } } @Override public String toString() { return "T"+id; } } public static void main(String[] args) throws IOException { int n = 10; List<Thread> group = new ArrayList<Thread>(n); for (int i=0; i<10; i++) group.add(new ExtractionThread(group)); for (Thread t : group) t.start(); } }
31 janv. 2014 à 23:27
merci pour ta réponse claire et rapide.
Le problème est que le plus gros de mon thread tiens dans une ligne (comparatif d'images avec sikuli, je n'ai pas accès au code natif qui est en C) et que je voudrais vraiment tuer mon thread tout de suite (pendant qu'il est en train d'effectuer le traitement de cette ligne, et non pas juste après....
de plus, j'ai essayer de mettre un synchronized sur ma méthode de KillThreadList mais ça donne toujours le même résultat...
Normalement, si je fais :
cette méthode ne devrait pas pouvoir être rappelée par un thread ou autre tant qu'elle n'a pas fini son traitement c'est bien ça ?
Merci par avance de ton éclaircissement
Cordialement
1 févr. 2014 à 00:01
La méthode ne pourra donc pas être appelé par un autre thread s'il "s'identifie" avec la même liste.