Lütfen aşağıdaki kodda Thread sızıntısı nedenini bulmama yardım edin. TestThread
, run() tamamlandıktan sonra (tescilli yazdırma ifadesinden doğrulanmış) ve ana yöntem çıktıktan sonra bile (print statement ve profiler aracından doğrulanmış) çöp toplamaz. Bununla birlikte, TestThread
TestThread
, bir Daemon Thread i.e. t.setDaemon(true)
olarak ayarlanmışsa toplanan çöpü alır. Aşağıdaki kod, yalnızca uygulamamdaki sorunu gösteren örnek bir koddur. Önceden varolan zamanlama sınıfını (ScheduledExecutorService
kullanarak başka biri tarafından tasarlanmış) kullanmaya çalışıyorum. Birden fazla Runnable
s sınıfla zamanlamaya devam ettiğimde, oluşturulan iş parçacıklarının asla çöp toplanmamasını fark ettim.Neden UserThread ScheduleExecutorService ile çalışan çöp toplamaz
public class ThreadTest {
static void runThreadWithExecutor() {
final String name = "TestThread";
ScheduledExecutorService ses = Executors.newSingleThreadScheduledExecutor(
new ThreadFactory() {
@Override
public Thread newThread(Runnable r) {
Thread t = new Thread(r, name);
t.setDaemon(false);
return t;
}
});
ses.schedule(new Runnable() {
@Override
public void run() {
System.out.println("entered " + name);
System.out.println("exiting " + name);
}},
2,
TimeUnit.SECONDS);
}
public static void main(String[] args) throws InterruptedException {
System.out.println("entered main");
runThreadWithExecutor();
Thread.sleep(5000);
System.out.println("exiting main");
}
}
İyi bilgi John. Bir tweak. 'stop()', tüm işlerin bitişi tamamlanana kadar iş parçacığı havuzundaki tüm iş parçacıklarını sonlandırmaz. – Gray
@Gray Good point –
Teşekkürler çocuklar. İlk başta kabul ettiğim cevap olarak seçtim, daha sonra Grase'ı seçtim, çünkü bu cevap Gray'in olmadan açıklayıcı değil. Ancak bu yanıt bana, kodu güvenle değiştirmek için gereken tüm açıklamayı verdi :) ve işe yarıyor! – Kes115