Bonjour,
Je souhaiterais savoir si il est possible de "tuer" un Thread qui ne répond pas dans un "ThreadPoolExecutor" ?
Concrètement, je crée un pool d'éléments se connectant en IMAP, l'IMAP peut, parfois, ne pas répondre. Il me faut dans ce cas "tuer" le Thread afin qu'il puisse être réutilisé ultérieurement.
J'ai essayé divers éléments, mais sans succès.
Voici les différentes étapes :
- Création :
- Ajout dans le pool :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 ArrayBlockingQueue<Runnable> queue = new ArrayBlockingQueue<Runnable>(5); ThreadPoolExecutor threadPool = new ThreadPoolExecutor(5, 5, 10, TimeUnit.SECONDS, queue);
- Lorsque c'est terminé normalement :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 threadPool.execute(agentIMAP);
- Tentative de "kill" manuel (qui ne fonctionne pas apparemment) :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 ArrayBlockingQueue<Runnable> queue2 = (ArrayBlockingQueue<Runnable>) threadPool.getQueue(); queue2.remove(agentIMAP);
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 // Kill du thread bloqué long threadID = agentIMAP.getThreadID(); //Retourne l'ID du Thread utilisé par l'agent Set<Thread> threadSet = Thread.getAllStackTraces().keySet(); Thread[] threadArray = threadSet.toArray(new Thread[threadSet.size()]); for (Thread thread : threadArray) { if (thread.getId() == threadID) { if (!thread.isInterrupted()) { thread.interrupt(); } } }
Le problème est qu'avec ce type de code, lorsque l' "agentIMAP" est bloqué par l'IMAP (sur la connexion ou autre) alors le Thread attend que l'IMAP termine.
Y-a-t-il possibilité de réellement tuer le Thread et faire que le ThreadPool le recrée ?
Merci d'avance.
Cordialement.
Partager