ThreadPoolExecutor - Gestion des threads ne répondant pas
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 :
Code:
1 2 3
|
ArrayBlockingQueue<Runnable> queue = new ArrayBlockingQueue<Runnable>(5);
ThreadPoolExecutor threadPool = new ThreadPoolExecutor(5, 5, 10, TimeUnit.SECONDS, queue); |
- Ajout dans le pool :
Code:
1 2
|
threadPool.execute(agentIMAP); |
- Lorsque c'est terminé normalement :
Code:
1 2 3
|
ArrayBlockingQueue<Runnable> queue2 = (ArrayBlockingQueue<Runnable>) threadPool.getQueue();
queue2.remove(agentIMAP); |
- Tentative de "kill" manuel (qui ne fonctionne pas apparemment) :
Code:
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.