Bonjour,
J'ai un problème pour stopper une tâche qui est exécutée par un ExecutorService.
Je garde en mémoire le "Future" que doit me retourner la méthode call de la classe implémentant Callable et j'appelle cancel(true) dessus.
Le problème est que mon thread lié à la tache ne stoppe pas.
Sachant que je souhaiterai éviter d'attendre qu'un traitement dans le thread soit fini pour checker si le booleen isInterrupted est true ou pas.
Voici la méthode call :
Pour le moment j'ai juste mis la vérif du booléen dans la grande boucle mais je vais surement devoir le vérifier ailleurs non ? Que se passe t'il si on souhaite stopper une tâche en plein milieu d'un traitement, y a t'il une exception de levée ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82 @Override public Boolean call() throws Exception { System.out.println("Thread " + Thread.currentThread().getId()); Iterator<IStep> it = run.getSteps(); IStep lastRepFwdStep = run.getLastStepRepFwd(); IStep step = null; if (debut != null) { while (it.hasNext()) { step = (IStep) it.next(); if (step.getName().equals(debut)) { break; } } } while (it.hasNext() && !isEnd && !Thread.currentThread().isInterrupted()) { // Si pas de début spécifié ou que le debut demandé a été // exécuté on // passe à l'étape suivante if (debut == null || debutExec) { step = (IStep) it.next(); } if (step.getName().equals(fin)) { isEnd = true; } currentStep = step; // notifyObservers(); // On met a true pour dire que l'étape debut demandé va être // exécuté, on pourra passer au suivante apres debutExec = true; if (((Step) step).getType().equals("fwd")) { StepForward stf = (StepForward) step; while (q.isEmpty()) { //Thread.sleep(100); // System.out.println("Attente qu'un message arrive dans le superviseur..."); } System.out.println("Message arrivé"); stf.setMessage(q.poll()); stf.setDestinataire(destinataire); IdataRetour data = stf.runStep(); list_dataPost = stf.getListData(); System.out.println("Retour de l'étape " + step.getName() + " : " + data.getMessage()); System.out.println("Queue réponse avant : " + qRep.size()); qRep.add(data.getMessage()); System.out.println("Queue réponse après : " + qRep.size()); } else if (((Step) step).getType().equals("rep")) { messArenvoyer = null; if (!qRep.isEmpty()) { messArenvoyer = qRep.poll(); } System.out.println("Réponse : " + step.getName() + messArenvoyer); if (lastRepFwdStep != null && lastRepFwdStep.getName().equals(step.getName())) { System.out .println("On notifie que c'est la dernière étape"); notifyLastStep(); } notifyObservers(); } else { step.setDataPost(list_dataPost); IdataRetour retour_data = step.runStep(); System.out.println("Retour de l'étape " + step.getName() + " : " + retour_data.getCode()); } } System.out.println("Fini par interruption : "+Thread.currentThread().isInterrupted()); Proxy.hotBilling = false; majTablesProxy(); return true; }
Partager