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: IndexProcessor
Dersim 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
İş 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.
Java nasıl bir iş Parçacığı için bir p...
Nasıl düzgün Java iki Tamsayılar karşı...
Bir iş parçacığı havuzu iş parçacığı k...
Java nasıl incelikle durdurmak için sü...
Nasıl JSP dosyaları Java kod önlemek i...