2017-05-19 3 views
10

J'ai un service d'exécuteur testamentaire à qui je présente plusieurs threads pour faire un travail, maintenant je veux annuler/interrompre l'exécution de certains des fils, laissez Je sais savoir comment puis-je faire cela?Comment obtenir un fil soumis à executer le service et l'interrompre en Java

Par exemple: - Ci-dessous est ma classe de fil imprimer le nom de fil après un certain intervalle infini.

public class MyThread implements Runnable { 
String name; 

public MyThread(String name) { 
    this.name = name; 
} 

@Override 
public void run() { 
    try { 
     System.out.println("Thread "+ name + " is running"); 
     sleep(500); 
    }catch (InterruptedException e){ 
     System.out.println("got the interrupted signal"); 
     e.printStackTrace(); 
    } 
} 
} 

Maintenant, je vais créer plusieurs threads en leur donnant le nom, de sorte que plus tard je peux interrompre ce thread particulier et arrêter son exécution.

maintenant dans ma classe de test je crée 4 fils et que vous voulez arrêter l'exécution de 2 fils nommés Amit et k. Laissez-moi savoir comment puis-je faire cela?

+2

Astuce: 'executorService.submit' vous donne un retour' 'avenir . –

+0

@AndyTurner, je sais que cela donne un 'Future', mais pouvez-vous me faire savoir comment puis-je l'utiliser dans mon cas retrive les fils avec le nom' amit' et interrompre son exécution? –

+0

Votre 'MyThread' n'a pas besoin d'étendre' Thread'. Implémentez simplement 'Runnable'. –

Répondre

10

Votre MyThread s ne sont pas réellement exécutés sur les discussions avec ces noms. Ils ne sont pas exécutés directement en tant que threads, ils sont exécutés sur les threads de ExecutorService.

Donc, vous devez garder un mappage de nom Future, puis annuler l'avenir quand vous voulez.

Map<String, Future<?>> map = new HashMap<>(); 
map.put("amit", executorService.submit(amit)); 
map.put("k", executorService.submit(k)); 
// ... etc 

Puis, pour annuler amit:

map.get("amit").cancel(true); 

Bien sûr, vous pouvez simplement avoir gardé des variables explicites:

Future<?> amitFuture = executorService.submit(amit); 
amitFuture.cancel(true); 

mais cela pourrait être trop compliqué si vous avez beaucoup de variables .

+0

Est-il également possible de me donner un nom propre au thread pour faciliter la journalisation et le débogage? –