2011-05-02 19 views
13

Bazı asenkron arka plan görevlerini çalıştırmak için önbelleğe alınmış iş parçacığı havuzu ExecutorService kullanıyorum. ThreadFactory'a iş parçacığını ExecutorService'e (ihtiyaç duyulduğunda) vermesini sağladım. Önbelleğe alınmış iş parçacığı havuzunu anladığımda, iş parçacığı 60 saniye boşta kaldıktan sonra ExecutorService tarafından sonlandırılır.Java ExecutorService çağrı geri bildirimi sonlandır

İş parçacığı sona ermek üzereyken bir durum temizleme yapmak istiyorum. Bunu başarmanın en iyi yolu nedir? ExecutorService, iş parçacığının yaşam döngüsüne kolayca kanca sağlamaz.

ExecutorService'imi kapatmak istemiyorum - geldikleri gibi görevleri çalıştırırken kullanışlıdır.

ExecutorService executor = Executors.newCachedThreadPool(new MyThreadFactory()); 

// Do some work 
executor.submit(new MyCallable()); 

// Need a way for the ExecutorService to notify me when it is about to 
// terminate my thread - need to perform some cleanup 

sayesinde

Shreyas sizin ThreadFactory kodunda

+0

+1. Sonlandırıcı işe yarayacak mı acaba? – Rom1

+0

@ Rom1, birisi finalize'in uygulanmasını öneren cevap yazmıştı. Sanırım onu ​​sildikleri çok kötü. Unutulmamalıdır ki, 'finalize' kullanmak, GC ve JVM'de bazı performans isabetlerine neden olmak demektir. –

+0

Sonlandırma yaklaşımını kullanmaya çalıştım ama işe yaramadı. Yöntem çağrılmadı. –

cevap

14

, örneğini oluşturmak Thread bunun için oluşturulan Runnable çalışmalarını yapmak try olacak ve daha sonra finally Temizlik etkinliğini yapmak öyle iş. Bunun gibi ilginç bir soru için

public Thread newThread(final Runnable r) { 
    Thread t = new Thread() { 
     public void run() { 
      try { 
       r.run(); 
      } finally { 
       //do cleanup code 
      } 
     } 
    }; 
    return t; 
} 
+1

Başka bir seçenek sabit boyutlu bir iş parçacığı havuzu kullanmak ve asla temizlemektir. Serbest bellek asla İşletim Sistemine geri gönderilmez, bu yüzden faydasız karmaşıklık katıyor olabilirsiniz. –

+2

ama temizlenmesi gereken şey bir veritabanı bağlantısı ise, 'asla asla temizleyemezsiniz.' – stu