2012-03-29 25 views
5

Zamanlanmış konuları çalıştırmak için ScheduledExecutorService kullanıyorum.
ServletContextListener.contextDestroyed uygulandım ve ScheduledExecutorService.shutdownNow ve awaitTermination çağırdı. İşte Tomcat 7 ve ScheduledExecutorService.shutdown

bir örnek:

CİDDİ: Hala

@Override 
public void contextDestroyed(ServletContextEvent servletcontextevent) { 
    pool.shutdownNow(); // Disable new tasks from being submitted 
    try { 
     // Wait a while for existing tasks to terminate 
     if (!pool.awaitTermination(50, TimeUnit.SECONDS)) { 
     pool.shutdownNow(); // Cancel currently executing tasks 
     System.err.println("Pool did not terminate"); 
     } 
    } catch (InterruptedException ie) { 
     // (Re-)Cancel if current thread also interrupted 
     pool.shutdownNow(); 
     // Preserve interrupt status 
     Thread.currentThread().interrupt(); 
    }   
} 


, Tomcat 7'den aşağıdaki hatayı alıyorum web uygulaması [/ servlet] bir başlatılmış görünüyor [Timer-0] adlı iş parçacığı ancak bunu durduramadı. Bu bir bellek sızıntısı oluşturmak için büyük olasılıkla olur.

Bu günlüğe göz ardı edilebilir mi? Yoksa yanlış bir şey yapıyorum?

Teşekkür

+0

Demek istediğim, benim düşüncem: Temizlik yapmak için sorumluluklarınız nerede duruyor? Burada başka ne yapılabilir? Kutuyu ateş hortumuyla mı vurdun? Tüm ciddiyetle, söylemek istediğim şey, sadece yapabileceğiniz her şeyi yapıyormuş gibi görünmesidir ... Bu hatayı görmezden gelirim. – ControlAltDel

+0

Daha önceki gönderime bakabilirsiniz :) http://stackoverflow.com/questions/9926356/scheduledexecutorservice-when-shutdown-should-be-invoked – lili

cevap

4

Bu hatanın Konu havuzunuzla ilgili olduğundan emin misiniz? 'Timer-0' iş parçacığı ismine göre değerlendirmek, muhtemelen bir zamanlayıcı tarafından başlatılmıştı.

Ayrıca, shutdownNow() işlevi size sonlandırmayı bekleyen Görevler listesini size geri göndermelidir (bkz. JavaDoc). Liste boş değilse daha fazla beklemek için mantık oluşturabilirsiniz.

1

doğru bir şekilde ScheduledExecutorService kapanıyor. Ancak, ExecutorService tarafından oluşturulan iş parçacıkları varsayılan olarak şu adlandırma kuralını izler: pool-X-thread-Y.

Timer-0 adet başlık Timer sınıfı tarafından oluşturulmuştur. Onları kodunuzda ve kütüphanelerinizde arayın.