Comment bien arrêter le Thread en Java?

J'ai besoin d'une solution pour bien arrêter le thread en Java.

J'ai IndexProcessorclasse 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 classe qui démarre et arrête le thread:

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 j'ai arrêté de tomcat, j'obtiens une exception dans mon IndexProcessor classe:

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)

Je suis à l'aide de JDK 1.6. La question est donc:

Comment puis-je arrêter le fil et ne pas jeter des exceptions?

P. S. je ne veux pas utiliser .stop(); méthode, car il est obsolète.

  • Mettre fin à un thread de la moitié du chemin sera toujours générer une exception. Si c'est un comportement normal, il vous suffit de les attraper et de les ignorer l' InterruptedException. C'est ce que je pense, mais je me demande aussi comment le standard est.
  • Comment sur l'utilisation de join()?
  • Je n'ai pas été à l'aide de threads, très souvent, donc je suis assez nouveau de threads, donc je ne sais pas si c'est le comportement normal d'ignorer l'exception. C'est pourquoi je demande.
  • Dans de nombreux cas, c'est le comportement normal d'ignorer l'exception et de mettre fin à la méthode de traitement. Voir ma réponse ci-dessous pour savoir pourquoi cela est bettern qu'une approche basée sur l'indicateur.
  • Une explication soignée par B. Goetz concernant InterruptedException peut être trouvé à l'adresse ibm.com/developerworks/library/j-jtp05236.
  • le InterruptedException n'est pas un problème, le seul problème dans la posté code est vous ne devriez pas vous connecter, il y a comme une erreur, il n'y a vraiment pas de raison convaincante pour le journal comme tous sauf de débogage juste pour démontrer qu'il s'est passé dans le cas où vous êtes intéressé. la réponse sélectionnée est regrettable, car il ne permet pas de couper court à des appels à des appels tels que le sommeil et d'attendre.