SORU
9 HAZİRAN 2012, CUMARTESİ


Nasıl düzgün Java iş Parçacığı durdurmak için

Bir çözüm düzgün java iş parçacığı durdurmak gerekiyor.

Çalıştırılabilir arabirimi uygulayan: IndexProcessorDersim var

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;
            }
        }

    }
}

Ve konu başlar durur: ServletContextListener Dersim var

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.");
        }
    }
}

Ama ben tomcat kapatma, İndexProcessor sınıfımdaki özel durum alıyorum:

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)

FIRSATLAR 1.6 kullanıyorum. Şimdi soru şu; nasıl iplik durdurabilir ve herhangi bir istisna atar değil mi?

P. S. ben kaldırılmış olduğundan .stop(); yöntemi kullanmak istemiyorum.

CEVAP
9 HAZİRAN 2012, CUMARTESİ


İş Parçacığı Kullanarak.() kesme bunu kesinlikle kabul edilebilir bir yoldur. Aslında, muhtemelen yukarıda önerilen gibi bir bayrak için tercih. Nedeni ise bir fasılalı eğer engelleme (iş Parçacığı.çağrı olmak uyku ya da java kullanarak.Kanal işlemleri nio), aslında bu sorun kırmak mümkün olacak.

Eğer bir bayrak kullanırsanız, bitirmek için engelleme işlemi için beklemek zorunda ve daha sonra bayrağı kontrol edebilirsiniz. Bazı durumlarda bu zaten, fasılalı olmayan standart İnputStream/OutputStream kullanma gibi yapmak zorundasın.

Bu durumda, ne zaman bir iplik kesilir, olmaz kesme IO, ancak, sen-ebilmek kolayca yapmak bu rutin olarak kodunuzu (ve bunu gereken stratejik noktaları nerede olabilir güvenli bir şekilde durdurun ve temizleme)

if (Thread.currentThread().isInterrupted()) {
  // cleanup and stop execution
  // for example a break in a loop
}

Dediğim gibi, konuya en büyük avantajı.() kesme hemen bayrak yaklaşımla yapamaz hangi fasılalı aramalar, patlak olabilir.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • failblog

    failblog

    17 HAZİRAN 2008
  • pucksz

    pucksz

    24 Mart 2006
  • UrAvgConsumer

    UrAvgConsume

    1 Ocak 2012