J'ai besoin d'une solution pour arrêter correctement le fil de discussion en Java.
J'ai IndexProcessor
classe qui implémente l'interface Runnable :
public class IndexProcessor implements Runnable {
private static final Logger LOGGER = LoggerFactory.getLogger(IndexProcessor.class);
@Override
public void run() {
boolean run = true;
while (run) {
try {
LOGGER.debug("Sleeping...");
Thread.sleep((long) 15000);
LOGGER.debug("Processing");
} catch (InterruptedException e) {
LOGGER.error("Exception", e);
run = false;
}
}
}
}
Et j'ai ServletContextListener
qui démarre et arrête le fil :
public class SearchEngineContextListener implements ServletContextListener {
private static final Logger LOGGER = LoggerFactory.getLogger(SearchEngineContextListener.class);
private Thread thread = null;
@Override
public void contextInitialized(ServletContextEvent event) {
thread = new Thread(new IndexProcessor());
LOGGER.debug("Starting thread: " + thread);
thread.start();
LOGGER.debug("Background process successfully started.");
}
@Override
public void contextDestroyed(ServletContextEvent event) {
LOGGER.debug("Stopping thread: " + thread);
if (thread != null) {
thread.interrupt();
LOGGER.debug("Thread successfully stopped.");
}
}
}
Mais quand je ferme tomcat, j'obtiens l'exception dans ma classe IndexProcessor :
2012-06-09 17:04:50,671 [Thread-3] ERROR IndexProcessor Exception
java.lang.InterruptedException: sleep interrupted
at java.lang.Thread.sleep(Native Method)
at lt.ccl.searchengine.processor.IndexProcessor.run(IndexProcessor.java:22)
at java.lang.Thread.run(Unknown Source)
J'utilise le JDK 1.6. La question est donc la suivante :
Comment puis-je arrêter le fil et ne pas lancer d'exceptions ?
P.S. Je ne veux pas utiliser .stop();
car elle est obsolète.
1 votes
L'interruption d'un fil à mi-chemin générera toujours une exception. S'il s'agit d'un comportement normal, vous pouvez simplement attraper et ignorer l'exception.
InterruptedException
. C'est ce que je pense, mais je me demande aussi comment est la méthode standard.0 votes
Je n'ai pas utilisé les fils de discussion très souvent et je suis donc assez novice en la matière. Je ne sais donc pas s'il est normal d'ignorer l'exception. C'est pourquoi je pose la question.
0 votes
Dans de nombreux cas, il est normal d'ignorer l'exception et de mettre fin au traitement de la méthode. Voir ma réponse ci-dessous pour savoir pourquoi cela est mieux qu'une approche basée sur les drapeaux.
1 votes
Une explication soignée de B. Goetz concernant
InterruptedException
peut être trouvé à ibm.com/developerworks/library/j-jtp05236 .0 votes
L'InterruptedException n'est pas un problème, votre seul problème dans le code posté est que vous ne devriez pas l'enregistrer en tant qu'erreur, il n'y a pas vraiment de raison impérieuse de l'enregistrer sauf en tant que débogage juste pour démontrer que cela s'est produit au cas où vous seriez intéressé. la réponse choisie est malheureuse car elle ne permet pas de couper court aux appels tels que sleep et wait.